R语言 避免使用(框)绘图函数重复代码

0pizxfdo  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(151)

为了生成几个具有相同风格的箱线图,我对boxplot函数进行了相同的调用,如下面的最小示例所示:

boxplot(Petal.Length ~ Species, iris, ylim=c(0,10))
abline(h=8)
legend('topleft',levels(iris$Species))

boxplot(Sepal.Length ~ Species, iris, ylim=c(0,10))
abline(h=8)
legend('topleft',levels(iris$Species))

我想通过避免代码重复来保持代码的可读性和可维护性。
因此,我想到使用装饰器,如
How customize a plot inside a R function which belong to a package?
Writing a decorator for R functions
https://weinstockjosh.com/post/2016-06-08-decorators-in-r/
然而,我找不到一种方法来封装/ Package 在(box)plot函数中用作参数的公式,这是一种漂亮的语法糖。
我在哪里可以找到R提供的合适的构造来保持代码的可读性和可维护性?

bybem2ql

bybem2ql1#

使用lapplyreformulate

lapply(c('Petal.Length', 'Sepal.Length'), \(x) {
  boxplot(reformulate(x, 'Species'), iris, ylim=c(0, 10))
  abline(h=8)
  legend('topleft', levels(iris$Species))
})
koaltpgm

koaltpgm2#

define函数创建箱线图

create_boxplot <- function(data, x_var, y_var, ylim_val, hline_val, legend_pos) {
  ggplot(data, aes_string(x = x_var, y = y_var)) +
    geom_boxplot() +
    ylim(ylim_val) +
    geom_hline(yintercept = hline_val) +
    labs(x = x_var, y = y_var, title = y_var) +
    theme_bw() +
    theme(panel.grid = element_blank()) +
    theme(axis.line = element_line(colour = "black")) +
    theme(legend.position = legend_pos)
}

每个变量调用函数

create_boxplot(iris, "Species", "Petal.Length", c(0, 10), 8, "topleft")
create_boxplot(iris, "Species", "Sepal.Length", c(0, 10), 8, "topleft")
vh0rcniy

vh0rcniy3#

我为面临同样问题的人找到了另一种选择:

boxplotCustom <- function (...) {
    boxplot(..., ylim=c(0,10))
    abline(h=8)
    legend('topleft',levels(list(...)[[2]]$Species))
}

boxplot(Petal.Length ~ Species, iris)
boxplot(Petal.Length ~ Species, iris)

我不得不承认它比原始解决方案长了两行,但是当在不同的文件中重用解决方案片段时,它可能会有优势。

相关问题