序列化 S4 对象列表

时间:2021-07-14 09:53:39

标签: r dataframe serialization s4

我有一个 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

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

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

<头>
... 对象
... 58 0a 00 00 00 03 00 04 00 03
... 00 04 00 03 00 03 05 00 00 00
... ...

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

1 个答案:

答案 0 :(得分:1)

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

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)

都将返回一个列表作为结果。如果这个列表可以简化为向量,就像原始列表一样,我们可以使用 sapply 代替 lapply

> sapply(sth, f)
[1] 01 02 03 04 05

或在 unlist 之后调用 Map

> unlist(Map(f, sth))
[1] 01 02 03 04 05

现在我们有了可以作为列添加到 data.frame 的向量,如下所示。

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