r - R - 使用包含函数的变量的条件语句的语法
问题描述
我正在努力确定语法来比较包含作为条件语句一部分的函数的变量的值。
我写了以下函数:
cv_func <- function(df, method, target, nFolds=5, seedVal=100, metrics_list=c("ACC","TPR","PRECISION","F1"), l=0.3, m=0.2, n=500, h='a', kernal='rbfdot', c=1, i=TRUE, f=TRUE, k=1, x=TRUE)
{
# create folds using the assigned values
set.seed(seedVal)
folds = createFolds(df[,target],nFolds)
# lapply loop
cv_results <- lapply(folds, function(x)
{
# data preparation:
test_target <- df[x,target]
test_input <- df[x,-target]
train_target <- df[-x,target]
train_input <- df[-x,-target]
if (method==MLP) {
pred_model <- method(train_target~., data=train_input, l=l, m=m, n=n, h=h)
}
else if (method==ksvm) {
pred_model <- method(train_target~., data=train_input, kernal=kernal, C=c)
}
else if (method==IBk) {
pred_model <- method(train_target~., data=train_input, control = Weka_control(I=i, K=k, F=f, X=x))
}
else {
pred_model <- method(train_target~., data=train_input)
}
pred_train <- predict(pred_model, train_input)
return(mmetric(train_target, pred_train, metrics_list))
})
# convert a list to a data frame using as.data.frame and convert this data frame to a matrix before using rowSds()
cv_results_m <- as.matrix(as.data.frame(cv_results))
cv_mean<- as.matrix(rowMeans(cv_results_m))
cv_sd <- as.matrix(rowSds(cv_results_m))
colnames(cv_mean) <- "Mean"
colnames(cv_sd) <- "Sd"
# Combine and show cv_results and Means and Sds
cv_all <- cbind(cv_results_m, cv_mean, cv_sd)
kable(t(cv_all),digits=3)
}
当我尝试使用默认参数运行该函数时,出现错误:
cv_func(df=df, method=IBk, target=20)
错误:“方法错误 == “MLP”:比较 (1) 仅适用于原子类型和列表类型”
关于我是否可以使用包含函数的变量作为 R 中条件的一部分的任何想法?
解决方案
该问题与参数类型有关。似乎需要一个字符串作为输入,因为它是一个函数,我们可以通过get
包裹字符串来获取函数的值。method
最后一个默认值可能会更好else
cv_func <- function(df=df, target=20, nFolds=5, seedVal=100, method, metrics_list=c("ACC","TPR","PRECISION","F1"), l=0.3, m=0.2, n=500, h='a', kernal='rbfdot', c=1, i=TRUE, f=TRUE, k=1, x=TRUE)
{
# create folds using the assigned values
set.seed(seedVal)
folds = createFolds(df[,target],nFolds)
# lapply loop
cv_results <- lapply(folds, function(x)
{
# data preparation:
test_target <- df[x,target]
test_input <- df[x,-target]
train_target <- df[-x,target]
train_input <- df[-x,-target]
if (method=="MLP") {
pred_model <- get(method)(train_target~., data=train_input, l=l, m=m, n=n, h=h)
}
else if (method=="ksvm") {
pred_model <- get(method)(train_target~., data=train_input, kernal=kernal, C=c)
}
else if (method=="IBk") {
pred_model <- get(method)(train_target~., data=train_input, control = Weka_control(I=i, K=k, F=f, X=x))
}
else {
pred_model <- get(method)(train_target~., data=train_input)
}
pred_train <- predict(pred_model, train_input)
return(mmetric(train_target, pred_train, metrics_list))
})
# convert a list to a data frame using as.data.frame and convert this data frame to a matrix before using rowSds()
cv_results_m <- as.matrix(as.data.frame(cv_results))
cv_mean<- as.matrix(rowMeans(cv_results_m))
cv_sd <- as.matrix(rowSds(cv_results_m))
colnames(cv_mean) <- "Mean"
colnames(cv_sd) <- "Sd"
# Combine and show cv_results and Means and Sds
cv_all <- cbind(cv_results_m, cv_mean, cv_sd)
kable(t(cv_all),digits=3)
}
然后将该函数称为
cv_func(method="IBk", metrics_list=metrics_list)
推荐阅读
- python - 在 matplotlib 中显示折线图的最大值
- javascript - Express.js:未定义的请求正文(base64)
- dynamics-crm - Dynamics CRM CI 流程 - 解决方案“增量导入”流程?
- javascript - JS Promise 在工作 chrome.storage.sync 时不会链接
- javascript - 如何在 http 中调用 facebook SDK?
- python - 在 Python 中重写 Mathematica 输出
- mysql - 从 MySQL 数据库中导出索引表
- c# - 使用 asp 标签助手时显示真正的运行时超链接
- oracle - Oracle Application Express 中的报告页错误
- powerbi - Power BI 中的详细到详细钻取