首页 > 解决方案 > R中带有嵌套循环的函数

问题描述

我正在尝试编写一个函数,如果给定位置 (x) 的所有 3 个阀门都打开 (1),则返回“失败”,但如果任何阀门关闭 (0),则返回“通过”。我的代码在下面,但它不起作用,我得到了错误---意外的'else' in:“else”---而且我不知道我的代码哪里出错了。

systemFail <- function(x) {
  
if(df$valveOne[df$location == x] == 1) {        
    if(df$valveTwo[df$location == x] == 1) {  
      if(df$valveThree[df$location == x] == 1) {
        print("Fail")}}}
      else {            
        print ("Pass")}
    else {            
    Print("Pass")}
else {
  Print("Pass")}
}

标签: rfunctionif-statementnested

解决方案


我认为你在最里面的 if-else 有太多的闭合花括号,而在外层没有足够的花括号:

尝试:

systemFail <- function(x) {
if(df$valveOne[df$location == x] == 1) {        
      if(df$valveTwo[df$location == x] == 1) {  
         if(df$valveThree[df$location == x] == 1) { print("Fail")}
         else { print ("Pass") } }
      else { print("Pass") } }
   else {print("Pass")} }

等等……这没有意义。为什么三个不同的阀门会有一个“位置”列。相反,它应该是:

df <- data.frame( valve2loc= sample(0:1,20, repl=TRUE), 
                  valve2loc= sample(0:1,20, repl=TRUE), 
                  valve3loc= sample(0:1,20, repl=TRUE))

因此,具有三个打开/关闭值的三个阀门让您决定是否全部打开:

 df$pass_fail <- c("Pass","Fail")[ 1+ (rowSums(df)==3)]

这是一个矢量化操作,计算阀门位置值的总和,确定它们在哪里都是“1”,如果是,则将逻辑 0/1 布尔结果加一,然后将其用作两个可能结果的索引。(基于索引,R 为 1,因此需要将 1 添加到逻辑值 (0/1) 以使它们可用于索引另一个 2 值向量。)


推荐阅读