R函数中的可选参数

时间:2018-05-17 21:42:39

标签: r function

我在R中编写了一个函数,它接受一个data.frame 一个文件路径,导致一个csv将作为data.frame读入。

我目前有这个:

occInput <- function(fileInput, dfInput = NA) {  
  if (is.na(dfInput)) occ.dat <- read.csv(file = fileInput)
  else occ.dat <- dfInput

  #manipulate the data in occ.dat
}

但是,当我实际传入data.frame作为dfInput参数时,它会抛出警告:

  

if (is.na(dfInput)) occ.dat <- read.csv(file = fileInput) else occ.dat <- dfInput中的警告:条件有长度&gt; 1而且只有   将使用第一个元素

虽然这实际上并没有对我的代码产生负面影响,但它很难看,并且它向我建议有更多优雅的方式在函数中包含/或可选参数。

有什么建议吗?我觉得我忽视了一些明显的事情。

4 个答案:

答案 0 :(得分:3)

当期望参数值为NAdata.frame等时,您不应该信任listis.na返回对这些数据结构的每个元素的NA检查。更好的选择可能是使用NULL初始化您的参数,并使用is.NULL进行检查。另一种选择可能是在missing参数上使用dfInput函数。您的函数定义可以写为:

occInput <- function(fileInput, dfInput = NULL) {  
  if (is.NULL(dfInput)) occ.dat <- read.csv(file = fileInput)
  else occ.dat <- dfInput

  #manipulate the data in occ.dat
}

#OR you can just use missing function

occInput <- function(fileInput, dfInput) {  
  #Perform missing check
  if (missing(dfInput)) occ.dat <- read.csv(file = fileInput)
  else occ.dat <- dfInput

  #manipulate the data in occ.dat
}

答案 1 :(得分:1)

为什么有两个参数?只需要一个并测试它的数据框架:

occInput <- function(Input) {  
  if (!inherits(Input,"data.frame")){
    # its not a data frame, so treat as a file name...
    Input = read.csv(Input)
  }
  # Now Input is a data frame...
}

适用于数据框,数据表和元素。

答案 2 :(得分:0)

我找到了一种(略微hacky)方法:使用if (identical(dfInput, NA))而不是if (is.na(dfInput)),它不会抛出任何错误,因为它检查两个参数是否相同而非等效。

然而,它对我来说似乎仍然不是很优雅。我会留下未解决的问题,以防其他人想要更好地捅它。

答案 3 :(得分:0)

如果仅检查向量的第一个元素,否则会提到警告。

检查传递的参数的class是否更容错:

occInput <- function(fileInput, dfInput = NA) {  
  if ("data.frame" %in% class(dfInput)) print("dfInput contains a data.frame") # read.csv(file = fileInput)
}

> occInput("adsf")
> occInput("adsf", "asdf")
> occInput("adsf", NULL)
> occInput("adsf", 1:10)
> occInput(dfInput = as.data.frame(mtcars))
[1] "dfInput contains a data.frame"