有没有办法检测 scale_linetype_manual 是否已添加到 ggplot?
Is there a way to detect if a scale_linetype_manual has been added to a ggplot?
我需要能够检测传递给函数的 ggplot 是否已经添加了 scale_linetype_manual
,以便我知道是否使用 ggnewscale
并添加另一个 new_scale("linetype")
这个函数应该可以解决问题:
has_linetype_manual <- function(p) {
x <- sapply(p$scales$scales, function(x) x$aesthetics == "linetype")
y <- sapply(p$scales$scales, function(x) as.list(x$call)$scale_name == "manual")
if(length(x) == 0) FALSE else any(x & y)
}
因此,设置示例:
library(ggplot2)
p1 <- ggplot(iris, aes(x = Sepal.Width, linetype = Species)) + geom_density()
p2 <- p1 + scale_linetype_manual(values = c(4, 5, 6))
p3 <- p1 + scale_linetype_discrete()
在上面的图中,只有 p2
在传递给 has_linetype_manual
时应该给我们 TRUE
has_linetype_manual(p1)
#> [1] FALSE
has_linetype_manual(p2)
#> [1] TRUE
has_linetype_manual(p3)
#> [1] FALSE
由 reprex package (v2.0.1)
于 2022-02-10 创建
我需要能够检测传递给函数的 ggplot 是否已经添加了 scale_linetype_manual
,以便我知道是否使用 ggnewscale
并添加另一个 new_scale("linetype")
这个函数应该可以解决问题:
has_linetype_manual <- function(p) {
x <- sapply(p$scales$scales, function(x) x$aesthetics == "linetype")
y <- sapply(p$scales$scales, function(x) as.list(x$call)$scale_name == "manual")
if(length(x) == 0) FALSE else any(x & y)
}
因此,设置示例:
library(ggplot2)
p1 <- ggplot(iris, aes(x = Sepal.Width, linetype = Species)) + geom_density()
p2 <- p1 + scale_linetype_manual(values = c(4, 5, 6))
p3 <- p1 + scale_linetype_discrete()
在上面的图中,只有 p2
在传递给 has_linetype_manual
TRUE
has_linetype_manual(p1)
#> [1] FALSE
has_linetype_manual(p2)
#> [1] TRUE
has_linetype_manual(p3)
#> [1] FALSE
由 reprex package (v2.0.1)
于 2022-02-10 创建