[英]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.