row-filter式でfilter()の代わりにユーザーがselect()を呼び出すと、正確なDPLYRの動作とは何ですか?(ゴッカ)

StackOverflow https://stackoverflow.com//questions/23039119

質問

DPLYRは、select()の代わりに、誤ってTBL_DF上のfilter()を誤って呼び出す場合は静かに渡ります。

select()が行フィルタ式を評価する方法(無意味な場合)、そしてそれが常に正常に評価されるのはなぜですか? Falseの代わりに、エラーをキャッチするのに役立ちます(および/または警告の警告の警告:SELECT()受信無意識式 ')、どちらも良い動作になりますか?

require(dplyr)
set.seed(1234)
df <- tbl_df(data.frame(u=sample.int(3,10,replace=T), v=sample.int(4,10,replace=T)))

df %.% select(u!=3 & v>=3) # NONSENSE! silently passes all rows of df!

df %.% filter(u!=3 & v>=3) # CORRECT: filters only the 4 rows specified

u v
1 1 3
2 2 3
3 2 4
4 2 4    

u v
1  2 3
2  1 3
3  1 2
4  2 3
5  1 2
6  3 3
7  1 3
8  1 2
9  3 1
10 3 4
.

役に立ちましたか?

解決

ソースの外観を見て、コード< / a>。

何が起こっているのかを完全に理解するには、debug(select_vars_q)を実行してからdf %.% select(u!=3 & v>=3)を実行しましょう。

変数varsargs

です。
Browse[2]> vars
[1] "u" "v"
Browse[2]> args
[[1]]
u != 3 & v >= 3
.

次に、argsに関連する行だけを考える。たとえば、 107

debug: ind_list <- lapply(args, eval, env = select_env)
Browse[2]> lapply(args, eval, env = select_env)
[[1]]
[1] FALSE
.

この行は、argsstarts_withends_with、...などのときに使用されます。 ( 67 )を参照してください。 argsに基づく可変インデックス番号

私たちの場合、戻り値はFALSEです(なぜ 61 0u=1を意味します。したがって、それはどのような変数と一致しません。 / select-vars.r#l112 "rel=" nofollow ">行は、何も一致していないときにすべての列が返されることを確認します。


分析を確認するには、この混乱を招くコマンドv=2を実行しましょう。 上記の分析によると、df %.% select(u=2)ind_listになり、列2が返されることを意味します。そしてその結果:

> df %.% select(u=2)
Source: local data frame [10 x 1]

   u
1  3
2  3
3  2
4  4
5  2
6  4
7  2
8  2
9  1
10 1
.

はい、それは2列目です。

selectの引数が2starts_with ...などではない場合、および引数が数値の場合(または数字として評価できます)、その番号が解釈されます。列番号として。

例えば、ends_withは最初の列を返し、df %.% select(1)は2番目の列を返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top