Вот пример из книги Hadley advanced R:
sample_df <- data.frame(a = 1:5, b = 5:1, c = c(5, 3, 1, 4, 1))
subset2 <- function(x, condition) {
condition_call <- substitute(condition)
r <- eval(condition_call, x, parent.frame())
x[r, ]
}
scramble <- function(x) x[sample(nrow(x)), ]
subscramble <- function(x, condition) {
scramble(subset2(x, condition))
}
subscramble(sample_df, a >= 4)
# Error in eval(expr, envir, enclos) : object 'a' not found
Хэдли объясняет:
Вы видите, в чем проблема? condition_call содержит условие выражения. Поэтому, когда мы вычисляем condition_call, оно также вычисляет условие, которое имеет значение a >= 4. Однако это не может быть вычислено, поскольку в родительской среде нет объекта, называемого a.
Я понимаю, что в родительском env нет a
, но eval(condition_call, x, parent.frame())
evals conditional_call в x (используемый в качестве среды data.frame), заключенный в parent.frame()
. До тех пор, пока в x есть столбец с именем a
, почему возникает какая-либо проблема?