2016-07-22 3 views
0

Привет, я провел следующие строки и был немного удивлен. Путаница рядный:Путаница с прицелом/параметр, проходящий в R

ИТАК создать список:

> x<-list() 

Назначают по 1 как элемент индексируется «а»

> x$a<-1 

Я прошу, чтобы посмотреть, что находится в х

> x 
$a 
[1] 1 

yup до сих пор так хорошо

рядом Заявляет функцию, которая будет принимать список, который передается к нему и как присвоения индекса «а» я просто присвоить индекс «б» значение 2

> foo<-function(xx) { 
+ xx["b"]<-2 
+ print(xx) 
+ } 

я вызываю функцию с й - Мне нравится то, что я вижу Теперь мое мышление, что объект списка был принят (по ссылке, как и в C, когда вы & х), и это было деструктивно модифицирован

> foo(x) 
$a 
[1] 1 

$b 
[1] 2 

Сейчас вне тела функции я печать х - но удивлен, не увидев b

> x 
$a 
[1] 1 

> 

Я читал scooping и передавал параметры docs, но не мог понять это. Является ли список глубоким или мелким, скопированным до того, как вызывается тело функции?

+2

Вам нужно либо «присваивать», либо «x <- foo (x)» – akrun

+0

, поэтому вы говорите, что мне нужно будет вернуть измененный список и повторно назначить его. Это не было бы изящным решением, потому что я пишу графический ходок ... позвольте мне взглянуть на назначение. Еще раз спасибо – user975917

+2

'Теперь я думаю, что объект списка прошел (по ссылке как на C)'. В первый раз я услышал, что C проходит по ссылке. BTW, R - * функциональный * язык программирования. Копируются аргументы функции, и их модификации не сохраняются вне области действия. – nicola

ответ

1

Из [1]:

Семантика вызова функции в R аргумента вызова по значению.

Это означает, что аргумент оценивается в вызывающем фрейме и глубоко копируется в среду оценки функций. (Единственное исключение является параметры по умолчанию, также см [1] для деталей.)

[1] https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Argument-evaluation

1

This question обсуждает копирования при модификации R в механизме более подробно; Объяснение функций Хэдли here содержит пример, очень похожий на ваш (смотрите раздел «Возвращаемые значения»). Краткое изложение состоит в том, что концептуально (и для всех практических целей с точки зрения пользователя) R всегда передает параметры по значению. За кулисами интерпретатор может избежать этого, если он может сделать вывод, что это безопасно, но программист приложений не может и не должен делать никаких предположений.

Смежные вопросы