嗨,我想检查data.frame中的一列是否存在,并且仅当它确实检查其他条件时才能检查。
我知道我可以使用示例中的嵌套if语句。
这通常用于检查功能的输入。这是一个工作示例,为我提供了我想要的输出,我只是想知道是否有更聪明的方法,因为这会变得混乱,特别是如果我在多种情况下这样做的话。我的例子:
testfun <- function(dat,...){
library(dplyr)
if("Site" %in% colnames(dat)){
#for example check number of sites, this condition could be anything though
if(n_distinct(dat$Site) > 1) stop ("Function must have site specific data")
}
#do stuff
return(1)
}
testdf1 <- data.frame(x = 1:10, y = 1:10)
testdf2 <- data.frame(x = 1:10, y = 1:10,Site = "A")
testdf3 <- data.frame(x = 1:10, y = 1:10,Site = rep(c("A","B"),each = 5))
testfun(testdf1)
testfun(testdf2)
testfun(testdf3)
使用更多上下文进行编辑:对于此示例,原因是用户可以输入特定于站点的数据,因此没有站点列(即,他们的data.frame仅包含一个数据)站点,因此他们从未将站点指定为列),或者他们可能正在使用data.frame,该数据具有在列中指定的多个站点的数据。因此,如果没有“站点”列,则可以安全地假设数据是针对一个站点的,并且它的有效值可以继续进行计算,但是如果存在“站点”列,我必须检查它是否只有一个不同的值(例如,可能已被过滤在应用通过plyr::ddply
进行应用的功能之前,请先在此列上进行操作)。
但是,在很多其他情况下,我想检查函数的输入数据是否符合预期格式,如果输入是data.frame,这通常意味着检查列名和有关该列的内容
答案 0 :(得分:0)
您可以确定这是否是一种更聪明的方法,但是一种方法是使用map_if
分隔逻辑。在这里,我们在谓词部分检查基本条件("Site" %in% colnames(dat)
),并基于此我们调用两个函数,一个用于TRUE
,另一个用于FALSE
。我们仍然检查类似的情况,但是通过将功能分开,可以保持代码的整洁,并且很容易理解哪个部分在做什么。
library(dplyr)
library(purrr)
testfun <- function(dat, ...) {
unlist(map_if(list(dat), "Site" %in% colnames(dat), true_fun, .else = false_fun))
}
true_fun <- function(dat) {
if(n_distinct(dat$Site) > 1) stop ("Function must have site specific data")
return(1)
}
false_fun <- function(dat) { return(1) }
testfun(testdf1)
#[1] 1
testfun(testdf2)
#[1] 1
testfun(testdf3)
.f(.x [[i]],...)中的错误:函数必须具有特定于站点的数据