web-dev-qa-db-ja.com

2つのベクトル(名前、値)から名前付きリストを作成する

名前付きリストを作成するために2つのベクトルでmapplyを使用する方法はありますか?最初のベクトルはcharacter型で、リストに使用される名前が含まれ、2番目のベクトルには値が含まれます。

これまでのところ、私が持っている唯一の解決策は次のとおりです。

_> dummyList = list()
> addToList <- function(name, value) {
+ dummyList[[name]] <- value
+ }
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2))
$foo
`1`

$bar
`2`
_

これはかなり不自然な解決策のように見えますが、それ以外の方法はわかりません。私が持っている問題は次のとおりです。

  1. dummyListは変更されず、dummyListの呼び出し後は空のリストですが、mapplyを作成する必要があります。

  2. 数値ベクトルc(1, 2)がリストに変換されない場合、mapplyの呼び出しの結果は、doubleの名前付きベクトルになります。

問題2を回避するには、2つのベクトルでmapplyを呼び出してから、結果で_as.list_を呼び出すだけですが、値を持つリストを直接作成する方法があるはずですベクトルで。

38
Jon Claus

setNames()を使用できます

setNames(as.list(c(1, 2)), c("foo", "bar"))

(リスト用)または

setNames(c(1, 2), c("foo", "bar"))

(ベクターの場合)

75
Ben Bolker

なぜあなたがこれをしたいのかについてのベンの困惑と彼の推薦を共有します。

好奇心のために、mapplyにはこれを可能にする一種の「隠された」機能があります。

x <- letters[1:2]
y <- 1:2
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE)
$a
[1] 1

$b
[1] 2

USE.NAMESのドキュメントには次のように書かれていることに注意してください:

USE.NAMES論理;最初の...引数に名前がある場合は名前を使用します。それが文字ベクトルの場合は、その文字ベクトルを名前として使用します。

9
joran