2016-08-05 11 views
2

と重なる変数名はのが、私はそうのように構築(dplyr/tibble)データ・フレーム/ TBLを持っているとしましょう:dplyrと周囲の環境

df <- data_frame(x = 1:10) 

、私はその関数内でこれを使用したいのですが

myfun <- function(df, x) { 
    x <- doSomeStuffTo(x) 
    filter(df, x == x) 
} 

しかし、これは常にフルdfを返します...私はdplyr動詞の中にスコープを実装する方法を把握しようとしている、のようなもの:

そうのように、いくつかのdplyr動詞を経由して dfで動作します
filter_(df, ~x == x) 

...どちらも動作しません。 thisdfインスタンスを参照

df.filter(this.x == x) 

...:いくつかの他の言語では、あなたのような何かを経由してこれを達成することができるかもしれません。

私の唯一の回避策これまでのところのように、関数の変数を命名されています

myfun <- function(df, query_x) { 
    query_x <- doSomeStuffTo(query_x) 
    filter(df, x == query_x) 
} 

私は、これはなんとかです疑う動詞dplyr SEで何とかをquery_xのような名前を使用せずに)(例えばfilter_を)しかし、私は正しいパターンをまだ見つけていません。誰でも答えがありますか?

答えて

1

あなたがfilter_を使用している場合は、quoteを経由して論理式を渡すことができます:動的に異なるdplyrを構築するには

myfun <- function(df, t) { 
    df$x <- 5*df$x 
    filter_(df, t) 
} 

> myfun(df, t= quote(x < 25)) 
# A tibble: 4 x 1 
     x 
    <dbl> 
1  5 
2 10 
3 15 
4 20 
2

あなたは、一般的な機能の標準評価版(アンダースコア付きのもの)とlazyevalパッケージを使用するコマンド。ここでは、

doSomeStuffTo <- function(x) {x+1} 

myfun <- function(df, x) { 
    x <- doSomeStuffTo(x) 
    filter_(df, lazyeval::interp(~x == y, y=x)) 
} 

df <- data_frame(x = 1:10)  
myfun(df,3) 

あなたの機能を変更することができる方法だが、それはあなたが交換したいxはっきりしていないので、でもINTERPに、私たちはx==xを持つことができません。 filter(df, 3==x)filter(df, x==3)はともにdplyrで動作します。等価のどちらかの側に定数または列名を付けることができます。

+0

単純に 'y < - doSomeStuffTo(x);を実行しない理由があるかもしれません。フィルタ(df、x == y) '? – Frank

+1

いいえ、それはおそらく私がやったことでしょう。私の意見では最も簡単なことですが、OPはいくつかの選択肢を求めていました。 – MrFlick

+0

ええ、たぶん私は質問を言い直してください。私は新しい変数の名前を割り当てる方法を知っていますが、各変数の言及の正確な範囲を指定するために、(SEまたはNSEのいずれかの)dplyrの動詞に範囲指定の仕掛けがないかどうかはわかりません。 – mmuurr

0

私は同じ問題につまずいた。さらに複雑な評価をするのではなく、関数の引数の名前を変更する方が簡単です。このように:

myfun <- function(df, x) { 
    x_ <- doSomeStuffTo(x) 
    filter(df, x == x_) 
} 

x_という別の変数がヒットする可能性があるため、このソリューションはまだ危険です。 1つは、変数名をdfにチェックし、そこにないものを選択することによって、これについて防衛的なことができます。あるいは、もっとゆっくりと、非常に不合理な変数名を使うことができます。私はしばしば_____tempのようなものを使う。

おそらく新しいdplyr 0.6.0評価システムがこれをよりうまく処理します。新しいシステムについての注意、tidyevalを参照してください。

関連する問題