0

多くの R 教科書では、$ を使用して data.frames^ から変数 (列) を取得することを推奨しています。ただし、これは関数内では機能しないことがわかりました。その理由はわかりません。

data(BOD)
print(BOD)

# These work. 
BOD$'demand'
BOD[ ,'demand']

# This works.
myFunc1 <- function(x, y){
  z <- x[ , y]
  return(z)
}
out <- myFunc(BOD, 'demand')

# This doesn't work.
myFunc2 <- function(x, y){
  z <- x$y
  return(z)
}
out <- myFunc2(BOD, 'demand')

R言語の定義では、次のように書かれていることに気付きました:

$ を使用した形式は、リストやペアリストなどの再帰オブジェクトに適用されます。インデックスとして文字列リテラルまたは記号のみを許可します。つまり、インデックスは計算可能ではありません。インデックスを見つけるために式を評価する必要がある場合は、x[[expr]] を使用します。$ が非再帰オブジェクトに適用されると、結果は常に NULL でした: R 2.6.0 以降、これはエラーです。

上記の myFunc2 は、$ がリテラル文字列として提供されていない例ですか?

^ Zuur 2009年「R初心者向けガイド」p61

^ スペクター 2008年「Rによるデータ操作」p 26, 64, 69

4

3 に答える 3

3

$個人的には、ドル演算子は R コンソールから便利で便利だと思います。補完および部分的な名前付け機能を許可します。$対話モードに便利です。ただし、関数内で使用する場合は、次の do.callように呼び出しを作成する必要があります。

myFunc2 <- function(x, y){
  z <- do.call('$',list(x,y))
  return(z)
}
myFunc2(BOD,'demand')
[1]  8.3 10.3 19.0 16.0 15.6 19.8

[しかし、あなたが言及したように、ここでは使いやすいです:

myFunc2 <- function(x, y){
  z <-     x[,y]
  return(z)
}
于 2013-07-18T00:16:39.407 に答える
1

演算子を完全に模倣したい場合は、パラメーターを$使用および設定して、部分一致を可能にします。[[exactFALSE

BOD <- data.frame(demand = 1:10)

myFunc2 <- function(x, y) x[[y, exact = FALSE]]

BOD$dem
## [1]  1  2  3  4  5  6  7  8  9 10

BOD[["dem"]]
## NULL

myFunc2(BOD, "dem")
## [1]  1  2  3  4  5  6  7  8  9 10
于 2013-07-18T04:22:50.173 に答える