复制 R 函数并更改它

Duplicate R function and alter it

是否可以在 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

背景:我使用 caret 包中的 rfe 进行特征选择。我将 rfFuncs 用作函数,但我想用具有比默认值 (1.5) 更高的公差值(2 或 3)的 pickSizeTolerance 函数替换默认的 selectSize 函数。这是一个例子

# 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"
                 )

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

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

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

从字面上看,复制函数但更改默认参数的方法可能是这样的:

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"