【问题标题】:How to get only one iteration in ifelse statement如何在 ifelse 语句中只获得一次迭代
【发布时间】:2019-05-15 15:03:29
【问题描述】:

我正在尝试通过函数传递字符串以从数据框中调用列。我做了一个非常简单的 if-else 函数,以确保在增加复杂性之前基础正常工作。本质上,如果在数据框中找到列名,则打印“Hi”,如果没有,则打印“No”。该函数正确识别列名是否在数据框中,但它会打印重复的“否”。

我尝试过使用if(){}else(){}

使用ifelse()

在 if(){}else(){} 方法中使用 break 和 next

df <- as.data.frame(cbind("a" = 1:5,
                    "b" = 6:10))

testingIf <- function(x){
  if(x %in% colnames(df)){
    print("Hi")
  }
  else{
    (print("No"))
  }
}
testingIf("a")
testingIf("This is true")

if(){}else(){} - 这是我最初的尝试,如果 'if' 为真,它会按预期工作,但如果 'if' 为假,它会打印出 [1] No [1] No。

使用ifelse() - 打印出 [1] Hi [1] Hi 为真,[1] No [1] No 为假

if(){}else(){} 语法中使用 break 和 next - 只要它给我正确的输出,这就是有效的,但我得到了

“错误:没有循环break/next,跳转到顶层”

,这让我觉得我错过了什么。

【问题讨论】:

  • 尝试使用print("No") 而不是(print("No")) 定义函数。作为参考,将print("no")print(print("no")) 的结果进行比较,这实际上是(print("no")) 所做的。
  • breaknextif/else 中没有意义,它应该导致错误:它们的含义只在 中使用'for'、'while' 或 'repeat' 循环”(参考:?break)。至于看到两次:第一次来自print,第二次也来自print,其中invisibly返回它的字符串。因为(正如 bouncyball 刚才所说)你做了(print(...)),它使不可见的可见。当缺少return 语句时,该函数将返回其最后一个表达式的值,即(print(...))
  • 如果您将(print(...)) 更改为print(...),然后调用(testingIf(...)),您将得到相同的双打印内容。
  • NotThatKindODr,cmets 有意义吗?他们解决问题了吗?有一些投票结束,所以如果到目前为止所说的内容没有开始解决问题,这将有所帮助。 (当投票结束时,无论是否合理,都可能会令人沮丧,只是想在更进一步之前获得您的反馈/关注。)
  • 感谢大家的帮助!从 print() 中删除多余的 () 确实解决了这个问题。

标签: r string if-statement break


【解决方案1】:

使用ifelse() 函数可以使您的函数变得更简单。

使用您的数据框df &lt;- as.data.frame(cbind("a" = 1:5,"b" = 6:10)),我们可以将您的函数重写为:

testingIf <- function(x,dt){
    ifelse(x %in% colnames(dt),"Hi","No")
}

现在测试代码,我们有:

> testingIf("a",df)
[1] "Hi"
> testingIf("This is true",df)
[1] "No"

希望这会有所帮助!

【讨论】:

  • 谢谢!我确实认为 ifelse 看起来更好,你知道使用它与长距离使用它有什么限制吗?
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 2012-11-15
相关资源
最近更新 更多