在R函数

时间:2017-08-18 10:33:54

标签: r function ellipsis

我有一个带有这样签名的函数:

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,]


}

1 个答案:

答案 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