如何否定子集论证

How to negate a subsetting argument

我正在编写一个对数据帧执行 t 测试的函数,根据我定义的参数对数据进行子集化。这是一个使用 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 档汽车,看看自动 (am=0) 汽车有 2 到 4 个化油器:

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 对象的对立面:A "not-NULL",或者一个简单地等于所有东西的通配符对象。如果不是,我可以修改我的代码以在子集化步骤中使用 NULL 对象吗?

使用关键字 "all"、"any" 和 "subset" 搜索通常 link 到引用函数 all() 和 any() 的页面,但没有找到我任何进一步。如果有任何帮助,我将不胜感激。

根据 Frank 在评论中的贡献,这是一个可行的解决方案:

testfunc <- function(dfrm, varq, factor, gear = unique(dfrm$gear),
                     am = unique(dfrm$am), carb = unique(dfrm$carb)){
  # 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)
}

在我的原始代码中,我有一个由 read.csv() 作为 dfrm 导入的文件路径,而不是 dfrm。该函数似乎没有问题处理参数中引用的 "dfrm" 出现在课程后面的事实。