Определение и функции в 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$
Не могли бы вы повторить и поставить сообщение об ошибке или ошибке?