2016-03-23 16 views
0

I varable Ausdruck einer lazyeval Funktion zu übergeben bin versucht:Parameter im Argument für lazy evaluation

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") 

Der Funktionstest funktioniert gut. Aber warum funktioniert test.species nicht?

Antwort

1

substitute(Species == substitute(species)) wird innerhalb test ausgewertet, dh Species wird nicht mit einem Zeichenwert verglichen, sondern mit einem Symbol (substitute(species)).

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

Danke:

bquote können hier stattdessen verwendet werden! Das funktioniert perfekt. Wie ich gerade herausgefunden habe, würde eval (substitute (Species ==. (Species))) auch funktionieren. Gibt es hier einen Unterschied zwischen bquote und substitute? –

+0

Denken Sie daran, dass eine nicht-standardmäßige Auswertung nett sein kann, aber es ist normalerweise besser, bei der Standardauswertung zu bleiben (was z. B. einfacher zu debuggen ist). – Roland

+0

@HengruiJiang Wo stellst du das hin? Es sollte nicht funktionieren. – Roland

Verwandte Themen