整数/表达式作为列表中元素的名称

时间:2015-07-07 21:32:40

标签: r list

我正在尝试理解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;。

2 个答案:

答案 0 :(得分:3)

原因是paste(1)是一个函数调用,它求值为字符串,而不是字符串本身。

The R Language Definition说:

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

我认为每种方法的缺点都非常严重。另一方面,我从未发现自己需要更丰富的命名语法。