R:我可以创建一个具有无意义参数的对象,然后在一个函数中使用它,该函数使用其输入参数将赋予它意义吗?

R: can I create an object with meaningless parameter and then use it inside a function that, using its input arguments, will give it meaning?

提问人:Maya Eldar 提问时间:10/17/2023 更新时间:10/17/2023 访问量:40

问:

是否可以创建一个包含无意义参数的列表,就像在列表中一样,然后在函数中将这个参数的含义作为参数,如下所示:fill.vardesign <- list( geom_boxplot(aes(fill=fill.var), na.rm=TRUE), theme(plot.title = element_text(size = 20, face = "bold"), legend.position = "bottom"), )

general_plot <- function(df,x.var,y.var,fill.var){
  ggplot(data=df, aes(x={{x.var}}, y={{y.var}}, fill={{fill.var}}))+design
}

plot_generator(subset_table,treatment,size,treatment)

当我尝试这样编写它时,我在运行该函数时出现错误,当我尝试时也是如此。 当我尝试并在尝试在函数中使用它之前运行对象时出现错误时,我遇到了错误。object `fill.var` not founddesign<-list(geom_boxplot(aes(fill=!fill.var)))design<-list(geom_boxplot(aes(fill=!!fill.var)))design<-list(geom_boxplot(aes(fill={{fill.var}})))design

我宁愿这样解决它,但我也可以创建一个默认值并从函数参数中多余它,我不知道如何......fill.var

TNX!

r ggplot2 全局变量 参数传递

评论

0赞 Quinton.Quagliano 10/17/2023
您可以将用户定义的函数参数设置为 NULL,这样可以解决您的问题。看看这是否会产生预期的效果。fill.var = NULL
0赞 Maya Eldar 10/17/2023
谢谢@Quinton.Quagliano,但是由于某种原因,该函数的参数没有屏蔽或过度全局,并且该函数创建了白色图,我认为这是它对NULL fill的解释......?fill.varfill.var

答:

0赞 TarJae 10/17/2023 #1

我认为您正在寻找结合整洁评估准报价

准引用是引用表达式的组合,同时允许立即评估(取消引用)该表达式的一部分。

1. 使用!! bang bang operator

sym()将变量名称从字符串转换为符号。

!!取消对符号的引用,以便 ggplot 将它们识别为列名

library(ggplot2)
library(rlang)

general_plot <- function(df, x.var, y.var, fill.var) {
  # Creating symbols
  x.var <- sym(x.var)
  y.var <- sym(y.var)
  fill.var <- sym(fill.var)
  
  design <- list(
    geom_boxplot(aes(fill = !!fill.var), na.rm = TRUE), 
    theme(plot.title = element_text(size = 20, face = "bold"), legend.position = "bottom")
  )
  
  ggplot(data = df, aes(x = !!x.var, y = !!y.var)) + design
}

general_plot(diamonds, "cut", "price", "color")

2. 使用{{}} curly curly

library(ggplot2)
library(rlang)

general_plot <- function(df, x.var, y.var, fill.var) {
  design <- list(
    geom_boxplot(aes(fill = {{ fill.var }}), na.rm = TRUE),
    theme(plot.title = element_text(size = 20, face = "bold"), legend.position = "bottom")
  )
  
  ggplot(data = df, aes(x = {{ x.var }}, y = {{ y.var }})) + design
}

general_plot(diamonds, cut, price, color)

enter image description here

评论

0赞 Maya Eldar 10/22/2023
谢谢@TarJae,但这两种解决方案都包括将设计列表插入到绘图函数中。我试图弄清楚是否有办法将列表保留在函数之外,即使代价是该列表中的函数之外有一个毫无意义的参数?