序列化 S4 对象列表

Serializing a List of S4 objects

我有一个 S4 对象列表,我需要一个数据框,其中列表中的每个对象都在一行中。我想使用 serialize() 函数来转换对象。

object_list # list of S4 objects

objects<-serialize(object_list,connection=NULL)

我的问题是,'objects' 的输出是一个很长的 raw()-vector。 Is 意味着所有 S4 对象都在一个 raw() 中转换。 它看起来像这样: [1] 58 0a 00 00 00 03 00 04 00 03 00 03 05 00 00 00 00 05 55 54 46 2d 38 00 01 03 19 00 00 04 02 00 ...

我现在找到了用任何循环解决这个问题的方法。序列化应该获取每个 S4 对象并将其转换,而不是将它们全部放在一个大向量中。

最后我想在数据框中添加每个向量(来自每个单个 S4 对象)。

... 对象
... 58 0a 00 00 00 03 00 04 00 03
... 00 04 00 03 00 03 05 00 00 00
... ...

希望有人能帮帮我,谢谢!

缺少可重现的例子假设我们有一个列表

sth <- list(11, 12, 13, 14, 15)

我们有一个函数,它接受一个东西并且 returns 是一个原始的:

f <- function(x) return(as.raw(x-10))

要将 f 应用于 sth 中的每个项目,我们可以使用 lapply,如:

lapply(sth, f)

of 如果您喜欢先命名函数,Map

Map(f, sth)

这将 return 一个列表作为结果。如果这个列表可以简化为向量,就像原始列表一样,我们可以使用 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)