我有一个S4对象的列表,我需要一个数据帧,其中列表中的每个对象都在一行中。我想使用serialize((函数来转换对象。
object_list # list of S4 objects
objects<-serialize(object_list,connection=NULL)
我的问题是,"objects"的输出是一个很长的raw((向量。是表示所有S4对象都转换为一个raw((。它看起来是这样的:[1] 58 0a 00 00 03 00 04 00 03 00 05 00 00 05 55 54 46 2d 38 00 01 03 19 00 00 04 02 00。。。
我现在找到了用任何循环来解决这个问题的方法。序列化应该取每个S4对象并将其转换,而不是全部转换为一个大向量。
最后,我想在数据帧中添加每个向量(来自每个S4对象(。
对象 | |
---|---|
58 0a 00 00 03 00 04 00 03 | |
00 04 00 03 00 03 05 00 00 | |
缺少一个可复制的例子,假设我们有一个的列表
sth <- list(11, 12, 13, 14, 15)
我们有一个函数,它取一个某物并返回一个原始值:
f <- function(x) return(as.raw(x-10))
要将f
应用于sth
中的每个项目,我们可以使用lapply
,如中所示
lapply(sth, f)
如果您喜欢先命名函数,则为Map
Map(f, sth)
两者都将返回列表作为结果。如果这个列表可以简化为向量,就像raws列表一样,我们可以使用sapply
而不是lapply
:
> sapply(sth, f)
[1] 01 02 03 04 05
或者在Map
:之后调用unlist
> unlist(Map(f, sth))
[1] 01 02 03 04 05
现在我们有了向量,我们可以将其作为列添加到data.frame
中,如下所示。
或者,我们可以使用带有一些变量i
的for
循环,但我们需要一些累加器acc
来收集循环中不同重复的结果:
acc = NULL # tell R this is an identifier.
for(i in 1:length(sth))
acc = append(acc, f(sth[[i]]))
print(acc)
或者没有append
功能:
acc = NULL
for(i in 1:length(sth))
acc[i] = f(sth[[i]])
print(acc)
要使生成的矢量成为data.frame
中的一列,我们首先需要一个data.frame:
sth <- list(11, 12, 13, 14, 15)
f <- function(x) return(as.raw(x-10))
dafra <- data.frame(id = 1:5, letter = letters[5:9])
dafra$objects = sapply(sth, f)
print(dafra)