【问题标题】:Control flow for returning list values返回列表值的控制流
【发布时间】:2021-02-01 14:30:12
【问题描述】:

我正在尝试返回给定此函数的值列表:

Pass_or_fail <- function(y){
 x = round(runif(y, 0, 100), 1)
  if(x>50){
    list(print("Passed"))
  }else if(x < 50){
    list(print("Failed"))
  }
}

当我将一个值传递给y 例如20 时,这应该返回一个PassedFailed 字符的列表。但是,上面的函数只返回一个向量。我希望它返回相对于上面提供的条件的 20 个值,主要是列表格式。

我正在考虑创建一个类似的变量:

t_list <- list(1:20)
#then
Map(Pass_or_fail(20), t_list)

示例输出(虽然不准确):

 "Passed" "Failed" "Passed" "Failed" "Passed" "Failed" "Passed" "Failed" "Passed" "Failed" "Passed" "Failed" "Passed" "Failed" "Passed" "Failed" "Passed" "Failed" "Passed" "Failed"

我似乎还无法弄清楚。

【问题讨论】:

  • 我们需要ifelse 而不是if() else。当你说“列表”时,我认为你的意思是一个向量。
  • 我用这个试过了,在输入上面的函数时似乎可以工作:replicate(10, Pass_or_fail(1)),虽然我更喜欢更干净的输出。
  • x == 50 时会发生什么?

标签: r function if-statement control-flow


【解决方案1】:

从表面上回答你的问题,

Pass_or_fail <- function(y){
    x = round(runif(y, 0, 100), 1)
    
    lapply(
        x,
        FUN = function(x){
            
            if(x>50){
                list(print("Passed"))
            }else if(x < 50){
                list(print("Failed"))
            }
            
        }
    )
    
}

注意:如果您定义的函数中没有lapply,则无法计算x 中的所有值,因为长度由y 定义。通过使用lapply,您将根据您定义的条件评估x 中的所有值。

然后将其输入lapply,得到以下内容;

results <- lapply(
    X = 1:10,
    FUN = Pass_or_fail
    )

这给出了 1 list pr。 X,每个在你的函数中的长度为x

【讨论】:

    【解决方案2】:

    应用map,您编写的函数将向量而不是单个元素作为输入。试试这个:

    Pass_or_fail2 <- function(y) {
      x <- round(runif(y, 0, 100), 1)
      condition <- ifelse(x > 50, "passed", "failed")
      print(condition)
    }
    
    map(Pass_or_fail2(10), 1)
    

    如果您想在函数Pass_or_fail2 中将向量作为输出注释print 并使用:

    unlist(map(Pass_or_fail2(10), 1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2020-07-28
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多