2

変数参照が".$mpg".

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

私はもともと次のようなことをしなければならないと思っていました: interp(~var, var = as.name(miles)wheremilesは に置き換えられますが.$mpg、上で述べたように、これはうまくいかないようです。

4

1 に答える 1

1

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

`$`(., mpg)

$つまり、2 つの引数を持つ関数への関数呼び出しです。を使用すると、Rは、上記の関数を呼び出すのではなくas.name、名前を持つ変数を後で検索します。`.$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')て目的の結果を得ることができます。

ただし、同じことを行うよりdplyrp_test -y な方法は、未評価のオブジェクトを に渡すことです。

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')
于 2016-03-23T11:00:36.540 に答える