繁体   English   中英

如何使用R语言提取函数内部使用的函数参数?!

[英]How can I extract a function argument to use inside the function using R language ?!

我正在尝试创建一个创建模型的函数,并可以预测任何给定data.frame的目标变量(例如mtcars)。

#Function to create a model for predicting a target variable
myRegModel = function(myFormula,myData){
sampleIndex = sample(1:nrow(myData),size= 0.7*nrow(myData), replace=FALSE)
myTraining = myData[sampleIndex, ]
myTesting = myData[-sampleIndex, ]
myDataFit = lm(myFormula, data = myTraining)
myTesting$predVar <- predict(myDataFit, myTesting)
myTesting$predErr <- abs(((myTesting$mpg - myTesting$predVar)/ myTesting$mpg)*100)
print(cor(myTesting$mpg, myTesting$predVar))
print(mean(myTesting$predErr))
print(summary(myDataFit)) 
}

myRegModel(mpg ~ ., myMtCars)

但是,在找到上面的预测误差和相关值的情况下,我已经对目标变量(mpg)进行了硬编码。 因为,我在函数中传递我的目标变量作为第一个参数,有没有办法可以提取我的目标变量并动态分配给myTesting data.frame。 (例如,myTesting $ target)

只是为了扩展@RuiBarradas方法,我们可以使用all.vars直接从公式中提取变量,然后使用[[ as @RuiBarradas建议

myRegModel <- function(myFormula,myData){
        nm1 <- all.vars(myFormula)[1]
        sampleIndex <- sample(seq_len(nrow(myData)),size= 0.7*nrow(myData), replace=FALSE)
        myTraining <- myData[sampleIndex, ]
        myTesting <- myData[-sampleIndex, ]
        myDataFit <- lm(myFormula, data = myTraining)
        myTesting$predVar <- predict(myDataFit, myTesting)
        myTesting$predErr <- abs(((myTesting[[nm1]] - 
                   myTesting$predVar)/ myTesting[[nm1]])*100)
        myTesting

    }

myMtCars <- mtcars
myRegModel(mpg ~ ., myMtCars)
#                  mpg cyl  disp  hp drat    wt  qsec vs am gear carb  predVar   predErr
#Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1 26.43998 15.964845
#Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 20.84027  2.615556
#Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1 20.30464 12.180316
#Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4 18.10403  5.708192
#Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4 11.22245  7.908153
#Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1 27.88747 13.927557
#Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1 25.47992 18.511254
#Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2 16.11037 16.091819
#Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2 25.64254 15.649525
#Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8 11.47808 23.479490

是的,有办法做你想做的事。 您只需对data.frame的列使用不同的表示法。 一般来说,在交互模式下,使用dat$col 但是当你编写一个函数时,使用dat[[col]]要好得多。 这些是完全相同的向量,但后者更灵活。

所以,在你的情况下,这将成为myTesting[[target]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM