我有一个带有这样签名的函数:
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,]
}
答案 0 :(得分:0)
这应该说明原则:
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
使用Reduce("&", Map("==", arguments, params))
。举个例子:
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