2013-08-28 2 views
4

Я читаю руководствов главе 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') 
+3

Косвенным образом, ваш вопрос является дубликатом http://stackoverflow.com/q/14837902/602276, где я спрашиваю довольно много и тот же вопрос, используя разные слова. – Andrie

+0

Если вы сделаете это с помощью вектора, отличного от 'data.table', вы увидите разницу в поведении. –

+0

@CarlWitthoft, что вы имеете в виду? Используя атомный вектор, символ 'id' останется нерешенным. –

ответ

0

Это то, что вы ищете?

fPrintArgument <- function(i) { 
    cc <- sys.call(sys.parent(1)) 
    print(deparse(cc[[2]])) 
} 
fCall <- function(x){ 
    fPrintArgument(x) 
} 
fCall('C') 
fCall(id == 'C') 
Смежные вопросы