我正在编写一个在数据帧上进行测试的函数,根据我定义的参数对数据进行子集化。这是一个使用 mtcars 数据的工作示例:
testfunc <- function(dfrm, varq, factor, gear = FALSE,
am = FALSE, carb = FALSE){
# Subset the data according to the arguments:
subsetdfrm <- dfrm[which((dfrm[,"gear"] %in% gear) &
(dfrm[,"am"] %in% am) &
(dfrm[,"carb"] %in% carb)),]
# Grab the groups to be compared according to arguments:
factorbinary <- get(factor)
# The t-test:
t <- t.test(dfrm[which(dfrm[factor]==factorbinary[1]), varq],
dfrm[which(dfrm[factor]==factorbinary[2]), varq],
data = subsetdfrm)
print(t)
}
下面是实际运行的函数,比较具有 3 个齿轮的汽车与具有 4 个齿轮的汽车,查看具有 2 到 4 个化油器的自动 (am=0) 汽车:
testfunc(mtcars, "mpg", "gear", gear = c(3,4), am = 0, carb = c(2:4))
请注意,我将参数的默认值定义为“FALSE”。我想要的是为这些参数找到一个自动否定子集的默认值,这意味着所有值都包括在内。我自己最好的解决方案是在函数开头为每个参数添加 if() 子句,如下所示:
if(carb == FALSE){gear <- unique(dfrm$gear)}
if(am == FALSE){am <- unique(dfrm$am)}
if(carb == FALSE){carb <- unique(dfrm$carb)}
一旦参数数量增加,这将变得难以管理。是否有一个默认值可以设置我的参数,这将否定子集?
我想象一些与 NULL 对象等价的东西:“非 NULL”,或简单地等于一切的通配符对象。如果不是,我可以修改我的代码以在子集步骤中使用 NULL 对象吗?
使用关键字“all”、“any”和“subset”进行搜索通常会链接到引用函数 all() 和 any() 的页面,但并没有让我进一步了解。我会很感激任何帮助,谢谢。