2016-03-23 3 views
0

Я пытаюсь передать varable выражение в lazyeval функции:параметр в аргументе для ленивых оценки

test <- function(expr){ 
    tmp <- iris[eval(substitute(expr), iris), ] 
    #actually do and return complicated stuff with tmp 
    return(data.frame(n = nrow(tmp), sepal.length = mean(tmp$Sepal.Length))) 
} 

test.species <- function(species){ 
    return(test(Species == substitute(species))) 
} 

#usage: 
test.species("virginica") 

Тест функция работает просто отлично. Но почему test.species не работает?

ответ

1

substitute(Species == substitute(species)) оценивается внутри test, что означает Species не по сравнению с значением символа, а символ (substitute(species)).

bquote здесь можно использовать вместо:

test.species <- function(species){ 
    eval(bquote(test(Species == .(species)))) 
} 
test.species("virginica") 
# n sepal.length 
#1 50  6.588 
+0

Спасибо! Это прекрасно работает. Как я только что узнал, eval (substitute (Species ==. (Species))) тоже будет работать. Есть ли разница между bquote и substitute здесь? –

+0

Имейте в виду, что нестандартная оценка может быть приятной, но обычно лучше придерживаться стандартной оценки (которая, например, легче отлаживается). – Roland

+0

@HengruiJiang Где вы это положили? Это не должно работать. – Roland

Смежные вопросы