2017-05-19 9 views
0

Ist es möglich, eine Funktion in R zu duplizieren und die Standardwerte eines Parameters in der duplizierten Funktion zu ändern? Zum BeispielR-Funktion duplizieren und ändern

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 

Hintergrund: Ich benutze rfe vom caret Paket für Merkmalsauswahl. Ich benutze rfFuncs als Funktion, aber ich möchte die Standardfunktion selectSize durch die Funktion pickSizeTolerance mit einem höheren Toleranzwert (2 oder 3) als die Standard-Toleranz (1,5) ersetzen. Hier ist ein Beispiel

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

'myPickSizeTolerance = function (..., tol = 3) pickSizeTolerance (..., tol = tol)' – Gregor

+0

Ehrfürchtig @Gregor .. soo einfach. Ich weiß nicht, warum ich nicht daran gedacht habe. –

Antwort

0

Dank Gregor, hier ist meine Lösung. Er gab die Antwort in seinem Kommentar.

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

Wenn die Funktion ist, die Sie notiert haben, brauchen Sie nicht, es zu kopieren, weil param1 ist eine Variable, die Sie definieren können, wenn Sie die Funktion aufrufen. Alles was Sie tun müssen ist myFunc(param1=2)

+0

Ja stimmt. Vielleicht war mein erstes Beispiel ein bisschen irreführend. Ich möchte 'pickSizeTolerance' mit einem anderen Toleranzwert verwenden. Diese Funktion ist jedoch Teil des Caret-Pakets und daher bereits definiert. –

Verwandte Themen