r-序列化S4对象的列表



我有一个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中,如下所示。

或者,我们可以使用带有一些变量ifor循环,但我们需要一些累加器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)

最新更新