Определение и функции в R 2.11.1: Что происходит?

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

Классический шаблон в псевдокоде:

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Ну, в том, что вы разместили, нет проблем:

/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$

Не могли бы вы повторить и поставить сообщение об ошибке или ошибке?