繁体   English   中英

在R函数中智能地使用省略号

[英]intelligently using the ellipsis in an R function

我有一个带有如下签名的函数:

myFunction=function(class="Class",v1='y',v2='y',dfparam=df){

其中df是一个数据帧,并且假定df中有一个称为Class的属性。 我想使其更通用,以便它可以接受各种数据框df,而不仅仅是具有属性Class的数据框。 所以我添加了className参数和classValue参数来替换class参数。 另外,我想允许无限制的参数v1,v2,v3等,因此我正在使用这样的省略号:

myFunctionGeneral = function(className="Class", classValue="democrat", dfparam=df, ...){
  arguments <- list(...)

在使用省略号之前,我有一行使用如下参数的行:

X_bool=dfparam$V1==v1 & dfparam$V2==v2 

我开始这样做:

X_bool=dfparam[,2]==arguments[1] & dfparam[,3]==arguments[2]

但是我想在省略号中使用无限数量的参数来执行此操作。 因此,我需要通过解开省略号来扩展此声明。 这是一个例子:

install.packages("vcd")
library(vcd)
data(Arthritis)
AAr=Arthritis[,-c(1,4)]


myFunctionGeneral=function(className="Class",classValue="democrat",dfparam=df, ...){

  dfparam$names<-rownames(dfparam)
  arguments<-list(...)


  dfparamDroppedClass=dfparam[,-1]
  #X_bool=dfparam[,2]==arguments[1] & dfparam[,3]==arguments[2] 
  X_bool=do.call(all, Map("==", dfparamDroppedClass, arguments))


  X=dfparam[X_bool,]


}

这应该说明原理:

arguments <- list(1, 2, 3)
params <- list(1, 2, 3)
do.call(all, Map("==", arguments, params))
#[1] TRUE

params <- list(1, 2, 4)
do.call(all, Map("==", arguments, params))
#[1] FALSE

全部等于任意数量的& ,并且Map迭代两个列表上的==

编辑:显然您的data.frame有多个观察值。 然后,您将无法all使用,但需要在Reduce("&", Map("==", arguments, params))使用Reduce 以您的示例为例:

myFunctionGeneral=function(className="Class",classValue="democrat",dfparam=df, ...){

  dfparam$names<-rownames(dfparam)
  arguments<-list(...)

  dfparamDroppedClass=dfparam[, -c(1, 4)]
  #X_bool=dfparam[,2]==arguments[1] & dfparam[,3]==arguments[2] 
  X_bool=Reduce("&", Map("==", dfparamDroppedClass, arguments))

  dfparam[X_bool,]      
}

myFunctionGeneral('Treatment','Placebo',AAr,'Male','Marked')
#   Treatment  Sex Improved names
#4    Treated Male   Marked     4
#5    Treated Male   Marked     5
#6    Treated Male   Marked     6
#8    Treated Male   Marked     8
#14   Treated Male   Marked    14
#52   Placebo Male   Marked    52

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM