gpt4 book ai didi

R ggplot2 奇怪的行为。看起来它是通过引用传递的

转载 作者:行者123 更新时间:2023-12-04 17:09:28 24 4
gpt4 key购买 nike

我正在尝试复制一个 ggplot 对象,然后将新复制对象的某些属性更改为例如将颜色线更改为红色。

假设这段代码:

df = data.frame(cbind(x=1:10, y=1:10))
a = ggplot(df, aes(x=x, y=y)) + geom_line()
b = a

然后,如果我更改变量 a 的线条颜色
a$layers[[1]]$geom_params$colour = "red"

它还改变了 b 的颜色
> b$layers[[1]]$geom_params$colour 
[1] "red" # why it is not "black"?

我希望我可以有两个不同的对象 ab具有不同的特点。因此,为了以正确的方式执行此操作,我需要再次为 b 调用绘图。使用 b = ggplot(df, aes(xy, y=z)) + geom_line() .但是,此时在算法中,没有办法知道绘图命令 ggplot(df, aes(x=x, y=y)) + geom_line()
你知道这有什么问题吗? ggplot 对象是否以不同的方式处理?

谢谢!

最佳答案

这里的问题是 ggplot使用 proto库来模仿 OO 风格的对象。 proto库依赖于环境来收集对象的变量。环境是通过引用传递的,这就是为什么您会看到自己的行为(也是没有人会建议以这种方式更改图层属性的原因)。

无论如何,改编 proto 中的一个例子文档,我们可以尝试对 ggplot 后面的内容做一个深拷贝目的。这应该“断开”它们。这是一个辅助函数

duplicate.ggplot<-function(x) {
require(proto)
r<-x
r$layers <- lapply(r$layers, function(x) {
as.proto(as.list(x), parent=x)
})
r
}

所以如果我们跑
df = data.frame(cbind(x=1:10, y=1:10))
a = ggplot(df, aes(x=x, y=y)) + geom_line()
b = a
c = duplicate.ggplot(a)

a$layers[[1]]$geom_params$colour = "red"

然后绘制所有三个,我们得到

enter image description here

这表明我们可以独立于“a”改变“c”

关于R ggplot2 奇怪的行为。看起来它是通过引用传递的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25732393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com