2017-10-18 14 views
0

私はまだRのquosuresを理解しようとしていますが、なぜ以下の関数の置換が失敗するのか分かりません。カスタム関数でrlang :: UQSの変数を使用するにはどうすればよいですか?

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) 

それは(実際に、それはあなたがquoで関数呼び出しをラップするときあなたが得るものだと、)my.toggle(toggle = T)と同等でなければなりませんmy.toggle(rlang::UQS(fn.args))を呼び出すように思えるが、機能が正しく実行されません。私は間違って何をしていますか?

答えて

0

あなたはそうのように、あなたのquosureを評価する必要があると思います:

library(rlang) 

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

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

(なぜそれが二回印刷しない。これはprint()のアーチファクトである:?printは、通常、その引数、目に見えないを返すことが評価するようです。 print("yes")(print("yes"))(括弧で手動で表示を切り替える)に置き換えると、動作はmy.toggle(toggle = TRUE)と再び一致します。私はそれについてあまり心配しないだろう)。

エラーが発生する理由:UQS()は、リストを返します。具体的には、Dotted pair list of 1:です。あなたはmy.toggle(UQS(fn.args)[["toggle"]])でハックすることができます。

関連する問題