row-filter式でfilter()の代わりにユーザーがselect()を呼び出すと、正確なDPLYRの動作とは何ですか?(ゴッカ)
-
21-12-2019 - |
質問
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)
を実行しましょう。
Browse[2]> vars
[1] "u" "v"
Browse[2]> args
[[1]]
u != 3 & v >= 3
.
debug: ind_list <- lapply(args, eval, env = select_env)
Browse[2]> lapply(args, eval, env = select_env)
[[1]]
[1] FALSE
.
この行は、args
がstarts_with
、ends_with
、...などのときに使用されます。 ( 67 )を参照してください。 args
に基づく可変インデックス番号
私たちの場合、戻り値はFALSE
です(なぜ 61 は0
とu=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の引数が2
、starts_with
...などではない場合、および引数が数値の場合(または数字として評価できます)、その番号が解釈されます。列番号として。
例えば、ends_with
は最初の列を返し、df %.% select(1)
は2番目の列を返します。