首页 > 解决方案 > 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 中条件的一部分的任何想法?

标签: rfunction

解决方案


该问题与参数类型有关。似乎需要一个字符串作为输入,因为它是一个函数,我们可以通过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)

推荐阅读