我正在尝试理解R中列表的名称,列表和列表。有一种方法可以方便地动态标记它们:
> ll <- list("1" = 2)
> ll
$`1`
[1] 2
但这不起作用:
> ll <- list(as.character(1) = 2)
Error: unexpected '=' in "ll <- list(as.character(1) ="
这两个都不是:
> ll <- list(paste(1) = 2)
Error: unexpected '=' in "ll <- list(paste(1) ="
为什么? paste()和 as.character()都返回&#34; 1&#34;。
答案 0 :(得分:3)
原因是paste(1)
是一个函数调用,它求值为字符串,而不是字符串本身。
Each argument can be tagged (tag=expr), or just be a simple expression.
It can also be empty or it can be one of the special tokens ‘...’, ‘..2’, etc.
A tag can be an identifier or a text string.
因此,标签不能是表达式。
但是,如果你想设置名称(只是一个属性),你可以用结构来做,例如
> structure(1:5, names=LETTERS[1:5])
A B C D E
1 2 3 4 5
在这里,LETTERS[1:5]
绝对是一种表达方式。
答案 1 :(得分:1)
如果您的目标只是使用整数作为名称(如问题标题中所示),则可以使用反引号或单引号或双引号键入它们(如OP已知的那样)。它们被转换为字符,因为所有名称都是R中的字符。
我无法提供一个深入的技术解释,说明为什么你的后期代码失败,“=
的左侧未在该上下文中进行评估(枚举列表中的项目)”。这是一个解决方法:
mylist <- list()
mylist[[paste("a")]] <- 2
mylist[[paste("b")]] <- 3
mylist[[paste("c")]] <- matrix(1:4,ncol=2)
mylist[[paste("d")]] <- mean
这是另一个:
library(data.table)
tmp <- rbindlist(list(
list(paste("a"), list(2)),
list(paste("b"), list(3)),
list(paste("c"), list(matrix(1:4,ncol=2))),
list(paste("d"), list(mean))
))
res <- setNames(tmp$V2,tmp$V1)
identical(mylist,res) # TRUE
我认为每种方法的缺点都非常严重。另一方面,我从未发现自己需要更丰富的命名语法。