2016-03-22 13 views
2

可変参照が".$mpg"の形式である場合、dplyrでのNSEの動作を理解できますか?dplyrのdo()を使用した複雑な式のNSE

hereを読んだあと、私は変数名を与える文字列を持っているので、as.nameを使うと思った。

たとえば、この作品:

mtcars %>% 
summarise_(interp(~mean(var), var = as.name("mpg"))) 

と、これは動作しませんが:

mtcars %>% 
summarise_(interp(~mean(var), var = as.name(".$mpg"))) 

が、これはありません:

mtcars %>% 
summarise(mean(.$mpg)) 

ので、これを行います

mtcars %>% 
summarise(mean(mpg)) 

.$mpgという形式で変数を指定できるように、次の例のようにデータのドットを指定するオプションがないときにdo()で使用できるようにします。

library(dplyr) 
library(broom) 

mtcars %>% 
tbl_df() %>% 
slice(., 1) %>% 
do(tidy(prop.test(.$mpg, .$disp, p = .50))) 
  • ここでは、prop.test関数の動作を示すためにランダム変数を選択しました。これをテストの誤用と解釈しないでください。私はもともと私のような何かをしなければならないだろうと思った

    library(lazyeval) 
    library(broom) 
    library(dplyr) 
    
    
    p_test <- function(x, miles, distance){ 
         x %>% 
         tbl_df() %>% 
         slice(., 1) %>% 
         do_(tidy(prop.test(miles, distance, p = .50))) 
        } 
    
    p_test(mtcars, ".$mpg", ".$disp") 
    

は最終的に、私はこのような機能にこれを有効にするmiles.$mpgに置き換えになるだろう interp(~var, var = as.name(miles)、しかしとして私はこれが動作していないトップに言及した。

答えて

1

理由はas.nameが未評価変数名を作成することであるが、コードで使用される場合.$mpgはなく、変数名あります。むしろ、それはと等価である複雑な式です:ある

`$`(., mpg) 

、それは二つの引数を持つ関数$への関数呼び出しです。 as.nameを使用すると、Rは後で上記の関数を呼び出すのではなく、`.$mpg`という名前の変数を検索します。

これは、あなたの試行がうまくいかない理由の説明です。その解決策は比較的単純です:未評価の変数名を作成する代わりに、評価されていない関数呼び出し式を作成する必要があります。私たちはこれをさまざまな方法で行うことができます。ここでは2つを示します。

最初は単純にparseを呼び出すことです:

p_test = function (data, miles, distance) { 
    x = parse(text = miles)[[1]] 
    n = parse(text = distance)[[1]] 
    data %>% 
     slice(1) %>% 
     do_(interp(~tidy(prop.test(x, n, p = 0.5)), x = x, n = n)) 
} 

今、あなたはp_test(mtcars, '.$mpg', '.$disp')を呼び出し、望ましい結果を得ることができます。

しかし、同じことをやってのよりdplyr -y方法はp_testに未評価のオブジェクトを渡すために、次のようになります。

p_test(mtcars, mpg, disp) 

...と私たちは簡単な変更でこれを行うことができます。

p_test_ = function (data, var1, var2) { 
    data %>% 
     slice(1) %>% 
     do_(interp(~tidy(prop.test(.$x, .$n, p = 0.5)), 
        x = as.name(var1), n = as.name(var2))) 
} 

p_test = function (data, var1, var2) { 
    p_test_(data, substitute(var1), substitute(var2)) 
} 

コードの今、次の2枚の仕事の両方:

p_test(mtcars, mpg, disp) 
p_test_(mtcars, 'mpg', 'disp') 
関連する問題