如何在R/Splus中创建名称但没有条目的列表?

low*_*rul 41 r s-plus

我想设置一个包含命名条目的列表,其值未被初始化(我计划稍后向它们添加内容).人们通常如何做到这一点?我弄完了:

mylist.names <- c("a", "b", "c")
mylist <- as.list(rep(NA, length(mylist.names)))
names(mylist) <- mylist.names
Run Code Online (Sandbox Code Playgroud)

但这似乎有点hacky.必须有更标准的方法来做到这一点......对吗?

Thi*_*ilo 51

我会这样做:

mylist.names <- c("a", "b", "c")
mylist <- vector("list", length(mylist.names))
names(mylist) <- mylist.names
Run Code Online (Sandbox Code Playgroud)

  • 有设置名称的功能:`setNames(vector("list",length(mylist.names)),mylist.names)`. (19认同)
  • 它总是取决于您要存档的内容.我通常喜欢分解步骤,以便更轻松地阅读代码.R/Splus倾向于让你在一行中写出相当多的东西 - 这对于测试和快速完成很好,但对可读性不利. (2认同)

Woj*_*ala 26

比Thilo有点短的版本:)

mylist <- sapply(mylist.names,function(x) NULL)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢.要添加一件事,如果您的名字是数字,则数字值将被忽略为名称,并且仅使用1,2,3 .......为了避免这种情况,请尝试:`sapply(as.character(4:6),function(x)NULL)` (2认同)
  • 小心在函数内使用`sapply` https://twitter.com/hadleywickham/status/434339083871993856 (2认同)

Tom*_*mmy 9

另一个棘手的方法:

mylist.names <- c("a", "b", "c") 

mylist <- NULL
mylist[mylist.names] <- list(NULL)
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为您替换了不存在的条目,因此它们已创建.遗憾的是列表(NULL)是必需的,因为NULL意味着删除一个条目:

x <- list(a=1:2, b=2:3, c=3:4)
x["a"] <- NULL # removes the "a" entry!
x["c"] <- list(NULL) # assigns NULL to "c" entry
Run Code Online (Sandbox Code Playgroud)

  • 我可能会使用`mylist < - list()`因为它更清楚地表明你正在初始化一个空列表.我实际上有点惊讶它将它设置为"NULL".我假设当你以这种方式分配时,`mylist`会从`NULL`升级到列表. (2认同)