Pergunta

Gostaria de entender a lógica que R usa ao passar argumentos para funções, criar cópias de variáveis, etc.em relação ao uso de memória.Quando ele realmente cria uma cópia da variável vs.apenas passando uma referência para essa variável?Em particular, as situações que me interessam são:

f <- function(x) {x+1}
a <- 1
f(a)

É a sendo passado literalmente ou é uma referência a um ser passado?

x <- 1
y <- x

Referência da cópia?Quando não é esse o caso?

Se alguém pudesse me explicar isso eu agradeceria muito.

Foi útil?

Solução

Quando passa variáveis, é sempre por cópia e não por referência.Às vezes, porém, você não conseguirá fazer uma cópia até que uma tarefa realmente ocorra.A verdadeira descrição do processo é passada por promessa.Dê uma olhada na documentação

?force
?delayedAssign

Uma implicação prática é que é muito difícil, se não impossível, evitar a necessidade de pelo menos duas vezes mais RAM do que seus objetos ocupam nominalmente.A modificação de um objeto grande geralmente exigirá a criação de uma cópia temporária.

atualizar:2015:Eu concordo (e concordo) com Matt Dowle que seu pacote data.table fornece uma rota alternativa para atribuição que evita o problema de duplicação de cópia.Se essa foi a atualização solicitada, não entendi no momento em que a sugestão foi feita.

Houve uma mudança recente na R 3.2.1 nas regras de avaliação para apply e Reduce.Foi anunciado com referência às notícias aqui: Retornando funções anônimas do lapply - o que está errado?

E a artigo interessante citado por jhetzel nos comentários está agora aqui:

Outras dicas

Resposta tardia, mas um aspecto muito importante do design da linguagem que não recebe cobertura suficiente na web (ou pelo menos nas fontes usuais).

x <- c(0,4,2)
lobstr::obj_addr(x)
# [1] "0x7ff25e82b0f8"
y <- x
lobstr::obj_addr(y)
# [1] "0x7ff25e82b0f8"

Observe o "endereço de memória" idêntico, ou seja,o local na memória onde o objeto está armazenado.Você pode assim confirmar que x e y ambos apontam para o mesmo identificador.

O livro Advanced R de Hadley Wickham aborda isso:

Considere este código:

x <- c(1, 2, 3)

É fácil ler como:“Crie um objeto chamado 'X', contendo os valores 1, 2 e 3”.Infelizmente, essa é uma simplificação que levará a previsões imprecisas sobre o que R está realmente fazendo nos bastidores.É mais preciso dizer que este código está fazendo duas coisas:

É criar um objeto, um vetor de valores, c(1, 2, 3).E é vinculativo que se objeto a um nome, x.Em outras palavras, o objeto, ou valor, não tem um nome;na verdade, é o nome que tem um valor.

Observe que os endereços de memória são efêmeros e mudam a cada nova sessão R.

Agora aqui está a parte importante.

Na semântica R, os objetos são copiados por valor.Isso significa que a modificação da cópia deixa intacta o objeto original.Como copiar dados na memória é uma operação cara, as cópias em r são o mais preguiçosas possível.Eles só acontecem quando o novo objeto é realmente modificado.Fonte:[Documentação da linguagem R][1]

Então, se agora modificarmos o valor de y anexando um valor ao vetor, y agora aponta para um "objeto" diferente.Isso está de acordo com o que a documentação diz sobre uma operação de cópia que acontece "somente quando o novo objeto é modificado" (preguiçoso). y está apontando para um endereço diferente do anterior.

y <- c(y, -3)
print(lobstr::obj_addr(y))
# [1] "0x7ff25e825b48"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top