Область действия и функции в R 2.11.1: что не так?

Этот вопрос возникает из ряда других вопросов, которые касаются, по сути, одной и той же проблемы. По какой-то странной причине использование функции в другой функции иногда дает сбой в том смысле, что переменные, определенные в локальной среде первой функции, не обнаруживаются во второй функции.

Классический паттерн в псевдокоде:

ff <- function(x){
    y <- some_value
    some_function(y)
}
ff(x)

Ошибка в eval (expr, envir, enclos): объект 'y' не найден

Сначала я подумал, что это как-то связано с методами S4 и их областью видимости, но то же самое происходит и с другими функциями. У меня было некоторое взаимодействие с командой разработчиков R, но все, что они сделали, это направили меня на сайт отчетов об ошибках (который, я должен сказать, не самый привлекательный). Я никогда не получал отзывов.

Поскольку проблема все время возникает, мне интересно, есть ли ей логическое объяснение. Является ли это распространенной ошибкой во всех этих случаях, и если да, то в каком? Или это действительно ошибка?

Некоторые из этих вопросов:

PS: Я знаю список R-devel, если вам интересно ...


person Joris Meys    schedule 01.10.2010    source источник
comment
Мне нравится ваш обходной путь по этому поводу stackoverflow.com/questions/3742415/   -  person Brandon Bertelsen    schedule 01.10.2010
comment
Я также связался с R-devel, и там мне сказали примерно то же, что мне рассказали @Richie, @Jonathan и @hadley. Спасибо всем за ценные ответы.   -  person Joris Meys    schedule 04.10.2010


Ответы (4)


Как упомянул Дирк в своем ответе, на самом деле проблем с опубликованным вами кодом нет. В ссылках, которые вы разместили в вопросе, похоже, есть общая тема: some_function содержит код, который каким-то образом портит среду. Этот беспорядок либо явный, с использованием new.env и with, либо неявный, с использованием аргумента data, который, вероятно, имеет строку вроде

y <- eval(substitute(y), data)

Мораль этой истории двояка. Во-первых, старайтесь избегать явного манипулирования средой, если вы действительно не уверены, что знаете, что делаете. А во-вторых, если функция имеет аргумент данных, поместите все переменные, которые вам нужны для использования этой функцией, внутри этого фрейма данных.

person Richie Cotton    schedule 04.10.2010
comment
Как я ответил Дирку, я знаю, что с этим кодом проблем нет. Это была просто иллюстрация. Спасибо за ответ, я думаю, это неплохо резюмирует. И спасибо за совет, который определенно избавит меня от большого разочарования. Принятый. - person Joris Meys; 04.10.2010

R имеет как лексическую, так и динамическую область видимости. Лексическая область видимости работает автоматически, но динамическая область видимости должна быть реализована вручную и требует тщательного учета. Только функции, используемые для интерактивного анализа данных, нуждаются в динамической области видимости, поэтому большинство авторов (например, я!) Не умеют делать это правильно.

См. Также: стандартные нестандартные правила оценки.

person hadley    schedule 01.10.2010

Несомненно, в R есть ошибки, но многие проблемы, с которыми люди сталкиваются, довольно часто связаны с ошибками в реализации some_function, а не в самом R. В R есть правила области видимости (см. http://cran.r-project.org/doc/manuals/R-intro.html#Scope), которые в сочетании с ленивым вычислением аргументов функции и возможностью eval аргументов в других областях являются чрезвычайно мощными, но которые также часто приводят к незаметным ошибкам.

person Jonathan Chang    schedule 01.10.2010

Что ж, в том, что вы опубликовали, нет проблем:

/tmp$ cat joris.r 
#!/usr/bin/r -t

some_function <- function(y) y^2

ff <- function(x){
    y <- 4
    some_function(y)  # so we expect 16
}
print(ff(3))          # 3 is ignored
$ ./joris.r 
[1] 16
/tmp$

Не могли бы вы переформулировать и описать фактическую ошибку или некорректную характеристику?

person Dirk Eddelbuettel    schedule 01.10.2010
comment
Он дал ссылки на 5 примеров. - person Brandon Bertelsen; 01.10.2010
comment
Круто, что дальше. Ссылка на просто посмотрите сами на интертюбах? Извините, конкретная помощь по конкретным и осязаемым вопросам. Джорис - очень умный файл cookie, и я был бы рад помочь с конкретными вопросами. - person Dirk Eddelbuettel; 01.10.2010
comment
Мой вопрос касается связи между пятью ошибками. Я не мог действительно скопировать всю дискуссию, которая там проходила, не так ли? - person Joris Meys; 02.10.2010