2015-12-02 2 views
12

$mutateを使用して面白い結果を得ています。同じ名前のグローバル環境内に変数がある要素として抽出されます。 (私はR 3.1.3とdplyr 0.4.3.9を実行しているよ。)これは正常に動作します:ドル記号演算子を使用するときにmutate()がグローバル変数の値を使用して抽出しようとしています

library(dplyr) 

df <- data.frame(time = 1:5, val = c(2.3, 3.9, NA, 8.1, 9.6)) 

mutate(df, val = approx(time, val, time)$y) 
# time val 
# 1 1 2.3 
# 2 2 3.9 
# 3 3 6.0 
# 4 4 8.1 
# 5 5 9.6 

をしかし、私はグローバル変数yを定義する場合は、面白いことが起こる:使用していることを

y <- 1L 
mutate(df, val = approx(time, val, time)$y) 
# Error: invalid subscript type 'integer' 

注意を期待通りに文字列引数を持つ二重括弧はまだ動作します:

yが文字の場合は

mutate(df, val = approx(time, val, time)[['y']]) 
# time val 
# 1 1 2.3 
# 2 2 3.9 
# 3 3 6.0 
# 4 4 8.1 
# 5 5 9.6 

は興味深いことに、我々はエラーの異なる種類を取得します

y <- 'a' 
mutate(df, val = approx(time, val, time)$y) 
# Error: unsupported type for column 'val' (NILSXP, classes = NULL) 

は最後に、完全を期すため、ここではこれは間違いなくないリスト抽出のための通常の動作であることを実証している例です:私たちはmutateの内側に、この奇妙な振る舞いを取得する理由

l <- list(y = 1:4) 
y <- 'a' 
l$y 
# [1] 1 2 3 4 

誰でも知っていますか?二重括弧を使用して抽出するか、検索パスに矛盾する変数がないことを保証する以外に、この問題を簡単に解決する方法はありますか? dplyr mutate fails with named vector?

+2

はのように思えますバグ。あなたは '$ 'y' 'を使うことができますが、それはちょうどハックです。 – Frank

+1

私は[バグ報告](https://github.com/hadley/dplyr/issues)を提出したいと思います。ダブルブラケットの抽出は非常に合理的な回避策のようです。 – MrFlick

+0

実際には、誰かがこれをバグとして提出したように見えます(これはバグではありません) 6日前:https://github.com/hadley/dplyr/issues/1554 – clbieganek

答えて

2

@clbieganekが指摘したように、これはバグです:ところで

、それは次のポストは、同じ問題を抱えていたかもしれませんが、かなりそれを実現していないでOPのように見えます。それは、まだコメントで提案されているように可能性を修正しました(dplyrバージョン4.3のよう)

に固定されていません。

$'y'

これは、この一般的な問題を追跡する問題である: https://github.com/hadley/dplyr/issues/1400

関連する問題