【问题标题】:Print or return string from a for loop我是 R 语言的新手,我遇到了一些练习问题,我无法获得这个问题的实际输出,需要帮助来调试
【发布时间】:2021-10-10 01:59:12
【问题描述】:

这里是问题 - 建立一个条件来检查向量标记中的所有数字(作为参数传递)是否大于 90。如果是,则将字符串“Best Class”分配给变量 ans,否则分配“Needs改进”。

这是我写的代码-

classmark<-function(marks){
 ans<- marks
 for(i in 1:length(marks)){
 if(marks[i] > 90){
         cat("Best Class")
     }
     else{
         cat("Needs Improvement")
     }
}    
return(ans)
}
print(classmark(c(100,95,94,56)))
print(classmark(c(100,95,94,96)))

实际输出 -

Best Class Best Class Best Class Needs Improvement
Best Class Best Class Best Class Best Class

我得到的输出 -

Best Class Best Class Best Class Needs Improvement[1] 100 95 94 56
Best Class Best Class Best Class Best Class[1] 100 95 94 96

建议任何需要在代码中修改以获得实际输出的更改

【问题讨论】:

  • 不要在 R 中使用cat。这是养成的坏习惯。如果要创建打印诊断消息的函数,请使用 message 函数。此外,一般来说,函数应该有一个适当的(和有用的)返回值(就像@Ronak 的第二个建议),而不仅仅是打印主要结果。

标签: r rscript


【解决方案1】:

由于条件是检查“所有”数字是否:

1.

classmark<- function(marks) { ans <- c() for (i in 1:length(marks))
    {
        if (marks[i] >90)   { ans<- "Best Class"  }
        else  { ans<- "Needs Improvement" } } return(ans) }

【讨论】:

    【解决方案2】:

    由于您只想在循环中打印,请从函数中删除 return 语句。

    classmark<-function(marks){
      ans<- marks
      for(i in 1:length(marks)){
        if(marks[i] > 90){
          cat("Best Class\n")
        }
        else{
          cat("Needs Improvement\n")
        }
      }    
    }
    
    classmark(c(100,95,94,56))
    #Best Class
    #Best Class
    #Best Class
    #Needs Improvement
    

    您还可以使用带有ifelse 的矢量化版本,它不需要for 循环。

    classmark<-function(marks){
     ifelse(marks > 90, "Best Class", "Needs Improvement")
    }
    
    classmark(c(100,95,94,56))
    #[1] "Best Class"   "Best Class"   "Best Class"    "Needs Improvement"
    

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 2022-11-02
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多