我在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而且只有 将使用第一个元素
虽然这实际上并没有对我的代码产生负面影响,但它很难看,并且它向我建议有更多优雅的方式在函数中包含/或可选参数。
有什么建议吗?我觉得我忽视了一些明显的事情。
答案 0 :(得分:3)
当期望参数值为NA
,data.frame
等时,您不应该信任list
。is.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"