2016-04-20 11 views
0

Rでは、短いコードを書くのに役立つと思われる多くの状況があります。ただし、ローカル変数や関数パラメータなどの既存のシンボルはマスクされます。名前を変更しないでデータを参照する方法はありますか?Rでスコーピングし、 'with'で処理する

たとえば、このフレームではstateの列があります。

df <- data.frame(
    label=c("a", "b", "c"), 
    state=c("off","on","off")) 

私は.stateパラメータを持つフィルタリング機能、およびフィルタ作品を書くことができます。

instateWorks <- function(.state) { 
    subset(df, df$state == .state) 
} 

# correct - 1 observation for "b" 
onWorks <- instateWorks("on") 

が、私は私の関数に賢明なパラメータ名を与えた場合、stateはデータフレームの列を参照するように思われる問題や記号があります。

instateFails <- function(state) { 
    subset(df, df$state == state) 
} 

# fails - all 3 observations 
onFails <- instateFails("on") 

stateは、パラメータを意味する期待通りにスクリプトを動作させることになっていることを修飾する方法はありますか?


編集 - なぜ「with」と「eval」が問題であるのかを明確にするために、このコードを検討してください。最後with声明で

df <- data.frame(
    label=c("a", "b", "c"), 
    state=c("off","on","off")) 

with(df, state == "on") 
# FALSE TRUE FALSE 

state <- on 
with(df, state == state) 
# TRUE TRUE TRUE 

は、私は状態の上の行に定義されている状態 『変数『DF内の変数と同じ値を持つ』「行が持っている私に言う』表現する方法を探しています。

この機能がなければ、列の名前と同じものと呼ばれるパラメーターを持つ関数を書くことはできません。

+1

使用この代わりのサブセット:instateFails < - DF機能(状態)[DFの$状態==状態、] 'ヘルプ(サブセット)から – chinsoon12

+1

' - *警告 これは、対話的に使用することを目的と便利な関数です。プログラミングのためには、[[']のような標準的なサブセッティング関数を使う方が良いでしょう。特に、引数サブセットの非標準的な評価は予期しない結果を招く可能性があります* –

+0

'with'の問題を示しているので、同じ問題が、dplyrで、 'filter(df、state == state)'と言うことができないところで起こります。式を関数に渡すことは一般的な問題です。これは呼び出し関数とは異なる環境では 'eval'です。 –

答えて

1

@ HaddE.Nuffのおかげで、私はこれを思いついた。

instateFails <- function(state) { 
    args <- environment() 
    subset(df, state == args$state) 
} 

呼び出しを行う前に現在の環境をキャプチャすると、呼び出し元の関数内のすべてのローカルを参照することができます。次に、フィルター式内の環境変数を参照します。

関連する問題