【问题标题】:R - Syntax for conditional statement that uses a variable containing a functionR - 使用包含函数的变量的条件语句的语法
【发布时间】:2019-07-26 01:03:11
【问题描述】:

我正在努力确定用于比较包含作为条件语句一部分的函数的变量的值的语法。

我写了以下函数:

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 中条件的一部分?

【问题讨论】:

标签: r function


【解决方案1】:

问题与参数类型有关。似乎需要一个字符串作为输入,并且因为它是一个函数,所以我们可以使用包裹在字符串周围的get 来获取函数的值。为最后一个else 设置一个默认的method 可能会更好

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)

【讨论】:

  • 啊,好吧,我没想到在函数中使用 'get(method)' 然后将方法值存储为字符串。我会在 RStudio.cloud 重新上线时尝试一下(它刚刚开始进行维护,这就是我的项目目前所在的位置)。
  • @KrisClegg。您可以离线尝试一个小示例以检查它是否有效
  • @KrisClegg。不过,有很多方法可以实现这一点。另一种选择是创建面向对象的方法调度
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 2021-10-29
  • 2021-02-02
  • 1970-01-01
  • 2016-05-18
  • 2012-02-26
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多