2017-10-18 2 views
0

J'essaie toujours de comprendre les quosures dans R, mais je ne comprends pas pourquoi la substitution dans la fonction ci-dessous échoue.Comment utiliser les variables de rlang :: UQS dans une fonction personnalisée?

my.toggle <- function(toggle) { 
    if (toggle) { 
    print("yes") 
    } else { 
    print("no") 
    } 
} 

fn.args <- list(toggle = T) 
my.toggle(rlang::UQS(fn.args)) # fails 
# Error in if (toggle) { : argument is not interpretable as logical 

rlang::quo(my.toggle(rlang::UQS(fn.args))) # but this is the right function call 
# <quosure: global> 
# ~my.toggle(toggle = TRUE) 

Il semble que l'appel my.toggle(rlang::UQS(fn.args)) devrait être équivalent à my.toggle(toggle = T) (et, en fait, c'est ce que vous obtenez lorsque vous enveloppez l'appel de fonction dans quo), mais la fonction n'exécute pas correctement. Qu'est-ce que je fais mal?

Répondre

0

Il faudrait évaluer votre quosure, comme suit:?

library(rlang) 

eval_tidy(quo(my.toggle(UQS(fn.args)))) 

[1] "yes" 
[1] "yes" 

(Pourquoi faut-il imprimer deux fois Ceci est un artefact de print(): print retourne normalement son argument, invisiblement Il semble évaluer. implicitement bascule la visibilité, de sorte que la valeur de retour imprime à nouveau.Si vous venez de remplacer print("yes") par (print("yes")) (basculer la visibilité manuellement avec parens), le comportement est à nouveau compatible avec my.toggle(toggle = TRUE)). Je ne m'inquiéterais pas trop à ce sujet). Pour savoir pourquoi vous obtenez l'erreur: UQS() renvoie une liste, en particulier: a Dotted pair list of 1: . Vous pouvez pirater avec my.toggle(UQS(fn.args)[["toggle"]]).