1

[orjoin関数を data.tables のリストに適用できるかどうか興味があります。リストの各要素に対して機能する関数を取得できますが、 を使用してリスト全体に関数を適用するとエラーが発生しますlapply

### Require data.table
require(data.table)

### Create master data.table
data <- data.table(id = letters[1:10], val = 1:10, key = 'id')

### Create data tables to be joined
a <- data.table(id = letters[1:10], height = rnorm(n = 10, mean = 150, sd = 10), key = 'id')
b <- data.table(id = letters[1:10], weight = rnorm(n = 10, mean = 140, sd = 20), key = 'id')

### Create a list of data tables to be joined
l <- list(a, b)

### Join data tables (Works)
`[`(l[[1]], data)
`[`(l[[2]], data)

### Apply join function to a list. Doesn't work. Why?
lapply(l, `[`, data)
Error in `[.default`(x, i) : invalid subscript type 'list'

[このエラーは、オブジェクトから要素を抽出するために使用される場合と、結合に使用される場合を R がどのように区別できるのか疑問に思います。例えば:

### Extract first column from each data.table in 'l'
lapply(l, `[`, 1)
4

1 に答える 1

4

あたり?lapply:

歴史的な理由から、lapply によって作成された呼び出しは評価されておらず、これに依存するコード (bquote など) が書かれています。これは、記録された呼び出しが常に FUN(X[[0L]], ...) の形式であり、0L が現在の整数インデックスに置き換えられることを意味します。これは通常は問題になりませんが、FUN が sys.call または match.call を使用する場合、または呼び出しを使用するプリミティブ関数である場合に問題になる可能性があります。これは、多くの場合、ラッパーを使用してプリミティブ関数を呼び出す方が安全であることを意味します。そのため、R 2.7.1 では is.numeric のメソッド ディスパッチが確実に行われるように lapply(ll, function(x) is.numeric(x)) が必要です。正しく。

[したがって、関数でラップする必要があります。

lapply(l, function(d) `[`(d, data))
于 2013-08-28T18:21:33.987 に答える