重复R功能并改变它

时间:2017-05-19 17:24:21

标签: r r-caret

是否可以复制R中的函数并更改复制函数中参数的默认值?例如,

myFunc <- function(param1 = 1) {
  return(1+param1)
}

# Duplicate function and alter param1
myFunc2 <- some way to duplicate myFunc and alter param1=1 to param1=2

背景:我使用插入符号包中的rfe来选择功能。我使用rfFuncs作为函数,但我想用selectSize函数替换默认的pickSizeTolerance函数,其公差值(2或3)高于默认值(1.5)。这是一个例子

# Create dummy data
trainData <- data.frame(a=runif(100), b=runif(100), c=runif(100), d=runif(100), e=runif(100), f=runif(100), g=runif(100), h=runif(100),i=runif(100),j=runif(100))
trainData$label <- factor(c(rep("Class A", 50), rep("Class B", 50)))

rfFuncs$selectSize <- pickSizeTolerance
ctrlRF <- rfeControl(functions = rfFuncs,
                     method = "cv",
                     number = 5,
                     verbose = F
                     )

# Do feature selection
rfProfile <- rfe(subset(trainData, select=-c(label)),
                 trainData[, "label"],
                 rfeControl = ctrlRF,
                 sizes = 1:10,
                 metric = "Accuracy"
                 )

3 个答案:

答案 0 :(得分:0)

如果函数是您记下的函数,则不需要复制它,因为param1是一个可以在调用函数时定义的变量。您所要做的就是运行myFunc(param1=2)

答案 1 :(得分:0)

感谢Gregor,这是我的解决方案。他在评论中提供了答案。

myPickSizeTolerance <- function(x, metric, tol=2, maximize) {
  return(caret::pickSizeTolerance(x, metric, tol, maximize))
}
rfFuncs$selectSize <- myPickSizeTolerance

答案 2 :(得分:0)

从字面上看,OP是一种复制函数但更改默认参数的方式,如下所示:

copyfun <- function(f, ...){
  l <- pairlist(...)
  a <- formals(f)
  n <- names(l)[names(l) %in% names(a)]
  a[n] <- l[n]
  formals(f) <- a
  f
}

除默认参数外,结果函数将与原始函数相同。一个可以更改所有或某些参数:

> copyfun(myFunc, param1=2)
function (param1 = 2) 
{
    return(1 + param1)
}


dummy <- function(a=1,b=2,c=3,d=4) paste(a,b,c,d)
> copyfun(dummy, b=100)
function (a = 1, b = 100, c = 3, d = 4) 
paste(a, b, c, d)
> copyfun(dummy, b=100, c=NULL)()
[1] "1 100  4"

您仍然可以提供自己的参数,而不是默认参数:

> copyfun(dummy, b=100, c=NULL)(a=101, c="C")
[1] "101 100 C 4"