R语言 NSE错误处理:使用NSE/整洁求值检查'NA'

ql3eal8s  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在使用tidyeval编写一个函数,在尝试检查NA时遇到了问题。
我正在编写一个函数,使用ggplot2绘制图,如下所示:

my_func <- function(data, x = NA, y = NA) {
  if(is.na(x) & is.na(y)) {
    stop("`x` and `y` cannot both be NA.")
  }
  if(is.na(y)) {
    data %>%
      ggplot2::ggplot(ggplot2::aes(x = {{ x }})) + 
      ggplot2::geom_bar()
  } else {
    data %>%
      ggplot2::ggplot(ggplot2::aes(y = {{ y }})) + 
      ggplot2::geom_bar()
  }
}

错误为:

data("iris")
my_func(data = iris, x = Species)

#> Error in my_func(data = iris, x = Species) :
#>   object 'Species' not found

我从Advanced R开始学习NSE和元编程,但对这个主题还是比较陌生的。
我已经使用NA s和is.naNULL s和is.null尝试了这个通用函数。我知道我错过了一些关于NSE的东西。

1qczuiv0

1qczuiv01#

我们可以用missing来创造条件

my_func <- function(data, x, y) {
  
  if(missing(y)) {
    data %>%
      ggplot2::ggplot(ggplot2::aes(x = {{ x }})) + 
      ggplot2::geom_bar()
  } else {
    data %>%
      ggplot2::ggplot(ggplot2::aes(y = {{ y }})) + 
      ggplot2::geom_bar()
  }
}
  • 测试
> my_func(iris, x = Sepal.Length)
> my_func(iris, y = Sepal.Width)

相关问题