Сфера охвата и функции в R 2.11.1: что не так? - PullRequest
14 голосов
/ 01 октября 2010

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

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

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

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 01 октября 2010

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

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

4 голосов
/ 01 октября 2010

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

3 голосов
/ 04 октября 2010

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

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

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

0 голосов
/ 01 октября 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$

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

...