【问题标题】:How to NOT modify an S4 object with a function in R? (flowset)如何不使用 R 中的函数修改 S4 对象? (流程集)
【发布时间】:2020-07-22 21:00:01
【问题描述】:

这个有点不寻常,我当然错过了一些东西。我有复杂的 S4 对象(流式细胞术数据;流集),出于可视化目的,我想修改对象内一些数据框的列名。我创建了一个将对象作为输入并应用修改的函数。问题是:即使我将此函数应用于我的对象的副本,它也会修改原始对象。这个问题使我无法进行下一步的分析。

a=b
c=rename_data(b)

这段代码修改了一个。

【问题讨论】:

    标签: r function arguments s4


    【解决方案1】:

    来自文档:

    flowSet 对象中的大部分数据存储在环境中,因此在复制 flowSet 对象时不会自动复制。如果x是flowSet类的对象,那么代码

    y <- x
    

    将创建一个对象 y,其中包含 x 中的 phenoData 和管理数据的副本,但引用与实际荧光数据相同的环境

    它继续解释如何制作深层副本(即“正确”副本)

    但是,请注意,子集操作(例如 y &lt;- x[i])确实会创建正确的副本,包括荧光数据适当部分的副本,正如预期的那样。因此,要正确复制 flowSet x,请使用 y &lt;- x[seq(along=x)]

    因此,在你的情况下,你应该这样做

    a <- b[seq(along = b)]
    c <- rename_data(b)
    

    现在a 包含b 的副本之前 rename_data 中固有的修改

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多