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