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内の変数と同じ値を持つ』「行が持っている私に言う』表現する方法を探しています。
この機能がなければ、列の名前と同じものと呼ばれるパラメーターを持つ関数を書くことはできません。
使用この代わりのサブセット:instateFails < - DF機能(状態)[DFの$状態==状態、] 'ヘルプ(サブセット)から – chinsoon12
' - *警告 これは、対話的に使用することを目的と便利な関数です。プログラミングのためには、[[']のような標準的なサブセッティング関数を使う方が良いでしょう。特に、引数サブセットの非標準的な評価は予期しない結果を招く可能性があります* –
'with'の問題を示しているので、同じ問題が、dplyrで、 'filter(df、state == state)'と言うことができないところで起こります。式を関数に渡すことは一般的な問題です。これは呼び出し関数とは異なる環境では 'eval'です。 –