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