【发布时间】:2020-07-22 21:00:01
【问题描述】:
这个有点不寻常,我当然错过了一些东西。我有复杂的 S4 对象(流式细胞术数据;流集),出于可视化目的,我想修改对象内一些数据框的列名。我创建了一个将对象作为输入并应用修改的函数。问题是:即使我将此函数应用于我的对象的副本,它也会修改原始对象。这个问题使我无法进行下一步的分析。
a=b
c=rename_data(b)
这段代码修改了一个。
【问题讨论】:
这个有点不寻常,我当然错过了一些东西。我有复杂的 S4 对象(流式细胞术数据;流集),出于可视化目的,我想修改对象内一些数据框的列名。我创建了一个将对象作为输入并应用修改的函数。问题是:即使我将此函数应用于我的对象的副本,它也会修改原始对象。这个问题使我无法进行下一步的分析。
a=b
c=rename_data(b)
这段代码修改了一个。
【问题讨论】:
flowSet 对象中的大部分数据存储在环境中,因此在复制 flowSet 对象时不会自动复制。如果x是flowSet类的对象,那么代码
y <- x
将创建一个对象 y,其中包含 x 中的 phenoData 和管理数据的副本,但引用与实际荧光数据相同的环境
它继续解释如何制作深层副本(即“正确”副本)
但是,请注意,子集操作(例如
y <- x[i])确实会创建正确的副本,包括荧光数据适当部分的副本,正如预期的那样。因此,要正确复制 flowSet x,请使用y <- x[seq(along=x)]
因此,在你的情况下,你应该这样做
a <- b[seq(along = b)]
c <- rename_data(b)
现在a 包含b 的副本之前 rename_data 中固有的修改
【讨论】: