首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将S4对象保存在列表列表中

将S4对象保存在列表列表中
EN

Stack Overflow用户
提问于 2019-03-25 16:07:58
回答 1查看 1.8K关注 0票数 6

当您想要将S4对象保存到列表列表中,并且元素之前还没有定义时,r将给出以下消息错误。

"invalid type/length (S4/0) in vector allocation"

为什么它处理的是一个简单的列表,而不是一个列表的列表?

请参阅下面的代码和潜在的解决方案。不过,我很肯定有一个更明显的解决办法。

代码语言:javascript
运行
复制
# Creation of an S4 object
setClass("student", slots=list(name="character", age="numeric", GPA="numeric"))
s <- new("student",name="John", age=21, GPA=3.5)

# Indexes for the list
index1 <- "A"
index2 <- "a"

# Simple list (All of this works)
l <- list()
l[[index1]] <- s
l[[index1]] <- "character"
l[[index1]] <- 999


# List of list 
l <- list()
l[[index1]][[index2]] <- s          # will give an Error!!
l[[index1]][[index2]] <- "character" # still working
l[[index1]][[index2]] <- 999         # still working


# "Workarounds"
l <- list()
l[[index1]][[index2]] <- rep(999, length(slotNames(s))) #define the element with a length equal to the number of slots in the s4 object
l[[index1]][[index2]] <- s # this works now!


l[[index1]][[index2]] <- list(s) # This works too, but that's not the same result

关于为什么它不能处理列表以及我如何解决这个问题,有什么建议吗?谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2019-03-25 17:00:19

所以当你这么做

代码语言:javascript
运行
复制
l <- list()
l[[index1]][[index2]] <- s

问题是,l被初始化为一个列表,所以使用l[[index1]]设置一个新的命名元素是有意义的,但是R不知道在l[[index1]][[index2]]中存储了什么。可能是任何东西。它可能是一个函数,而函数不知道如何处理命名的索引操作。例如

代码语言:javascript
运行
复制
l <- list()
l[[index1]] <- mean
l[[index1]][[index2]] <- "character"

但在您的情况下,当您试图从一个尚未初始化的列表中获取一个值时,您将得到NULL。例如

代码语言:javascript
运行
复制
l <- list()
l[[index1]]
# NULL

当您尝试在空对象上设置一个命名的原子值时,r恰好具有特殊的行为。观察

代码语言:javascript
运行
复制
# NULL[["a"]] <- "character" is basically calling....
`[[<-`(NULL, "a", "character")
#           a 
# "character" 

注意,我们在这里得到了一个命名向量。不是名单。对于您的“工作”示例也是如此。

代码语言:javascript
运行
复制
l <- list()
l[[index1]][[index2]] <- "character"
class(l[[index1]][[index2]])
# [1] "character"

还请注意,这与S4没有任何关系。如果我们试图设置一个更复杂的对象,比如一个函数,也会发生同样的情况。

代码语言:javascript
运行
复制
l <- list()
l[[index1]][[index2]] <- mean
# Error in l[[index1]][[index2]] <- mean : 
#   invalid type/length (closure/0) in vector allocation

在Perl等语言中,您可以“神奇地”通过自生化使用正确的索引语法来实现哈希,但在R中并非如此。如果您希望在l[[index1]]上存在一个list(),则需要显式地创建它。这会起作用的

代码语言:javascript
运行
复制
l <- list()
l[[index1]] <- list()
l[[index1]][[index2]] <- s

同样,这是因为[[ ]]在R中有点模糊,它是一个泛型索引函数,不专门用于列表。

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55341976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档