当R中的默认值为NULL时,我如何指定一个参数对象?

rqmkfv5c  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(125)

我正在尝试编写一个函数,将某些参数的默认值设置为NULL。然而,当我想在调用函数时指定这些参数不为NULL时,我收到了错误消息:找不到这些对象。
简单的启动器功能:

library(dplyr)
toydf <- data.frame(Name = "Fred", Age="Old", Hair="Brown")
toyA <- function(df, groupA){
  data.frame(A = df%>%dplyr::select({{groupA}}))
}
toyA(toydf, Name)
toyA(toydf, Age)

我想指定一些参数以具有NULL默认值,thisthis似乎建议应该工作。我试试这个:

toyB <- function(df, groupA, groupB=NULL, groupC=NULL){
  if((!is.null(groupB)) & (!is.null(groupC))){
    data.frame(A = df%>%dplyr::select({{groupA}}),
               B = df%>%dplyr::select({{groupB}}),
               C = df%>%dplyr::select({{groupC}}))
  }
  else{
    data.frame(A = df%>%dplyr::select({{groupA}}))
  }
}

但这给了我一个错误:

toyB(toydf, Name, Age, Hair)
Error in toyB(toydf, Name, Age, Hair) : object 'Age' not found

我们可以通过检查missing()来解决它,就像其他一些问题和解决方案建议的那样。

toyC <- function(df, groupA, groupB, groupC){
  if((!missing(groupB)) & (!missing(groupC))){
    data.frame(A = df%>%dplyr::select({{groupA}}),
               B = df%>%dplyr::select({{groupB}}),
               C = df%>%dplyr::select({{groupC}}))
  }
  else{
    data.frame(A = df%>%dplyr::select({{groupA}}))
  }
}
toyC(toydf,Name)
toyC(toydf, Name, Age, Hair)

为什么NULL默认值不起作用?

q3qa4bjr

q3qa4bjr1#

您应该直接在select中使用NSE。

toyB <- function(df, groupA, groupB=NULL, groupC=NULL){
  df %>% select({{groupA}}, {{groupB}}, {{groupC}})
}

toyB(head(iris), Species)
  Species
1  setosa
2  setosa
3  setosa
4  setosa
5  setosa
6  setosa

toyB(head(iris), Species, Sepal.Length, Sepal.Width)
  Species Sepal.Length Sepal.Width
1  setosa          5.1         3.5
2  setosa          4.9         3.0
3  setosa          4.7         3.2
4  setosa          4.6         3.1
5  setosa          5.0         3.6
6  setosa          5.4         3.9

相关问题