Я читаю руководствов главе 4.3, и я просто не понимаю. Может быть, кто-то может дать мне краткое объяснение, почему R ведет себя следующим образом.R оценка аргумента функции
fCall <- function(i){
dtData[i]
}
fSubstituteCall <- function(i){
iSub <- substitute(i)
dtData[eval(iSub)]
}
library(data.table)
dtData <- data.table(id=LETTERS, value=1:26)
dtData[id == 'C'] #works
fCall(id == 'C') #Error in eval(expr, envir, enclos) : object 'id' not found
fSubstituteCall(id == 'C') #works
Почему fSubstituteCall работает и fCall нет? Это связано с оценкой i? Или это действительно что-то конкретное для пакета data.table?
EDIT:
Спасибо так далеко за ваши ответы. Я как бы понимаю, и я согласен, что это дубликат stackoverflow.com/q/14837902/602276. Поэтому я собираюсь упростить свой вопрос.
Как сделать fPrintArgument напечатать аргумент i как строку? Поэтому в случае fCall ('C') он должен распечатать строку 'C', а в fCall (id == 'C') он должен распечатать строку 'id ==' C "'.
Возможно ли это?
fPrintArgument <- function(i){
#This is what i have come up with so far, but it doesn't work
print(deparse(substitute(i)))
print(deparse((i)))
}
fCall <- function(x){
fPrintArgument(x)
}
fCall('C')
fCall(id == 'C')
Косвенным образом, ваш вопрос является дубликатом http://stackoverflow.com/q/14837902/602276, где я спрашиваю довольно много и тот же вопрос, используя разные слова. – Andrie
Если вы сделаете это с помощью вектора, отличного от 'data.table', вы увидите разницу в поведении. –
@CarlWitthoft, что вы имеете в виду? Используя атомный вектор, символ 'id' останется нерешенным. –