是否可以将数字向量存储在列表的名称变量中?即。
x <- c(1.2,3.4,5.9)
alist <- list()
alist[[x]]$somevar <- 2我知道我可以将其存储为列表元素中的向量,但我认为如果数字向量是list元素本身的名称,则更快地遍历并找到我想要的列表元素的元素(如果需要的话).
编辑:I在下面的上下文中包含了代码片段,为术语的更改表示歉意。简单地说,我正在处理一个聚类问题,数据集太大,无法直接计算距离,我的解决方案是为数据的每个维度创建回收箱,并为原始数据中的每个观察找到最近的收件箱。当然,我不能建立一个完整的排列矩阵,因为这比原始数据本身要大。因此,我选择为每个维度分别查找最近的bin,并将其添加到向量temp.bin中,理想情况下,它将成为存储原始观察的行名的列表元素的名称。我希望这将简化搜索和添加回收箱到列表中。
我还意识到,距离计算部分很可能是错误的-这仍然是一个原型。
binlist <- list()
for(i in 1:nrow(data)) # iterate through all data points
{
# for each datapoint make a container for the nearest bin found
temp.bin <- vector(length = length(markers))
names(temp.bin) <- markers
for(j in markers) # and dimensions
{
# find the nearest bin for marker j
if(dist == "eucl")
{
dists <- apply(X=bin.mat, MARGIN = 1, FUN= function(x,y) {sqrt(sum((x-y)^2))}, y=data[i,j])
temp.bin[j] <- bin.mat[which(dists == min(dists)),j]
}
}
### I realise this part doesn't work
binlist[[temp.bin]] <- append(binlist[[temp.bin]], values = i)到目前为止,最接近的答案是约翰科尔曼。
发布于 2018-02-15 12:07:22
names(alist)是一个字符向量。数字向量不是字符串,因此它不是list元素的有效名称。因此,你想要的是不可能的。您可以为这样的列表创建一个字符串表示,并将其用作名称,但这将非常麻烦。如果这是你真正想做的事情,你可以做如下的事情:
x <- c(1.2,3.4,5.9)
alist <- list()
alist[[paste(x,collapse = " ")]]$somevar <- 2这将创建一个1元素列表,其唯一元素的名称为"1.2 3.4 5.9"。
虽然这可能有一些用例,但我怀疑您有一个XY problem。你想达到什么目的?
发布于 2018-02-15 10:46:17
解决方案
只要稍加修改,我们就可以实现以下目标:
x = c(1.2,3.4,5.9)
alist = vector("list", length(x))
names(alist) = x
alist[as.character(x)] = list(c(somevar = 2))
#$`1.2`
#somevar
# 2
#
#$`3.4`
#somevar
# 2
#
#$`5.9`
#somevar
# 2 解释
基本上:
list (vector("list", length(x)))names(alist) = x)[按名称调用列表级别,并为每个列表元素(alist[as.character(x)] = list(c(somevar = 2)))分配一个新列表。第二解
请听约翰科尔曼的评论:
你是否回答了这个问题还不清楚。您给出了一个列表,它的名称向量是向量x,它被胁迫为字符。OP询问是否有可能“如果数字向量是list元素本身的名称.”。他们想把x当作一个名字,而不是一个名字的向量。
如果您想让列表元素以向量x命名,可以使用 trick进行尝试
x = c(1.2,3.4,5.9)
alist = list()
alist[[deparse(substitute(x))]]$somevar = 2
#> alist[[deparse(substitute(x))]]
#$somevar
#[1] 2如果您真的希望将x中的数字值作为名称本身,那么我将指向John's solution。
https://stackoverflow.com/questions/48805135
复制相似问题