當我修改復制的 Geom 物件的一部分時,這也會修改底層的原始 Geom。為什么?
(非常感謝用戶 Stefan 通過評論我現在洗掉的上一個問題來確定這個問題)。
library(ggplot2)
GeomFunction$required_aes
#> [1] "x" "y"
GeomFunction2 <- GeomFunction
GeomFunction2$required_aes <- c("x", "y", "fun")
GeomFunction$required_aes
#> [1] "x" "y" "fun"
由reprex 包(v2.0.1)創建于 2022-01-09
uj5u.com熱心網友回復:
因為 ggproto 類物件是環境而不是類似串列的結構,可以使用is.environment(GeomFunction). 環境不遵循例如向量所遵循的修改時復制啟發式。
為修改目的制作副本的正確方法是使用ggproto建構式。從技術上講,您正在制作GeomFunction.
library(ggplot2)
GeomFunction2 <- ggproto(NULL, GeomFunction)
GeomFunction2$required_aes <- c("x", "y", "fun")
identical(GeomFunction$required_aes, GeomFunction2$required_aes)
#> [1] FALSE
由reprex 包(v2.0.1)創建于 2022-01-09
另外,由于 ggproto 物件是環境,我們可以使用它ls()來查看它們包含的內容。
ls(GeomFunction2)
#> [1] "required_aes" "super"
ls(GeomFunction)
#> [1] "draw_panel" "super"
ls(Geom)
#> [1] "aesthetics" "default_aes" "draw_group" "draw_key"
#> [5] "draw_layer" "draw_panel" "extra_params" "handle_na"
#> [9] "non_missing_aes" "optional_aes" "parameters" "required_aes"
#> [13] "setup_data" "setup_params" "use_defaults"
可以看到層次結構中的每一層都只包含相對于父級的變化,以及一個神秘的super物件,它是一個函式。super呼叫該函式時,您可以看到它檢索父類。
class(GeomFunction2$super())
#> [1] "GeomFunction" "GeomPath" "Geom" "ggproto" "gg"
由reprex 包(v2.0.1)創建于 2022-01-09
沒有super物件Geom表明這Geom是根類。
ggproto該類存在的原因是允許擴展重用大量代碼,而不必從頭開始構建它們。理論上,ggproto 類似于 R6 或參考類的面向物件編程,但我認為 R6/參考類有一些缺點,不允許跨包繼承它們的類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/406991.html
標籤:
