if语句在for循环中被忽略

8ftvxx2r  于 2023-03-20  发布在  其他
关注(0)|答案(4)|浏览(149)

我正在写一个基本的for循环,其中除了最后一行之外,所有的输出都应该是相同的,但是我的if语句总是被忽略,即使条件是TRUE

test_string <- c("test", "test2", "test3")

i <- 1
for(i in length(test_string)) {
  answer <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string, "%'")

  } else{
    paste0("This IS the LAST '%", test_string, "%'")
  }
  i <- i+1
}

#> [1] "This IS the LAST '%test%'"  "This IS the LAST '%test2%'"
#> [3] "This IS the LAST '%test3%'"
o7jaxewo

o7jaxewo1#

尝试在第一行添加seq_沿着(),如下所示:

test_string <- c("test", "test2", "test3")

for(i in seq_along(test_string)) {
  answer <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string[i], "%'")
  } else{
    paste0("This IS the LAST '%", test_string[i], "%'")
  }
  print(answer)
}
#[1] "This is not the last '%test%'"
#[1] "This is not the last '%test2%'"
#[1] "This IS the LAST '%test3%'"

要将输出存储为变量:

test_string <- c("test", "test2", "test3")
answers <- c()

for(i in seq_along(test_string)) {
  answer <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string[i], "%'")
  } else{
    paste0("This IS the LAST '%", test_string[i], "%'")
  }
  answers <- c(answers, answer)
}

# View the results
answers
yc0p9oo0

yc0p9oo02#

因为i在循环中总是3
要看到这一点,添加print(i)作为循环的第一行。

test_string <- c("test", "test2", "test3")

i <- 1
for(i in length(test_string)) {
  print(i) # New
  answer <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string, "%'")
    
  } else{
    paste0("This IS the LAST '%", test_string, "%'")
  }
  i <- i+1
}

# Output: [1] 3

然后我会删除尽可能多的代码,同时仍然保留错误。当我在这里这样做时,我会得到这样的结果:

test_string <- c("test", "test2", "test3")
for(i in length(test_string)) {
  print(i)
}

# Output: [1] 3

实际上,我们现在唯一能做的就是将length(test_string)放入控制台:

> length(test_string)
[1] 3

也就是说,您实际上根本不是在“循环”,而是将i设置为单个值(3),然后运行一次单个代码块。

> 1:length(test_string)
[1] 1 2 3

因此,当我用这个新表达式更新for循环时,我想我得到了您最初期望的结果:

test_string <- c("test", "test2", "test3")

i <- 1
for(i in 1:length(test_string)) {
  print(i) # New
  answer <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string, "%'")
    
  } else{
    paste0("This IS the LAST '%", test_string, "%'")
  }
  i <- i+1
}

# Output
[1] 1
[1] 2
[1] 3
juud5qan

juud5qan3#

你需要通过1循环到向量的length(即1:length(test_string))。此外,你需要迭代test_string(即test_string[i])。如果你先初始化answer,然后将循环的每一步结果赋给它,那么你会得到一个与test_string大小相同的向量,并得到所需的输出。

test_string <- c("test", "test2", "test3")

answer <- vector()

for(i in 1:length(test_string)) {
  answer[i] <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string[i], "%'")
  } else{
    paste0("This IS the LAST '%", test_string[i], "%'")
  }
} 

answer
#> [1] "This is not the last '%test%'"  "This is not the last '%test2%'"
#> [3] "This IS the LAST '%test3%'"

reprex package(v2.0.1)于2023年3月17日创建

rfbsl7qr

rfbsl7qr4#

你忘了两件事:for子句声明和[i]中长度之前的1:,用于访问test_string的元素:

test_string <- c("test", "test2", "test3")

i <- 1
for(i in 1:length(test_string)) {
  answer <- if(i < length(test_string)) {
    paste0("This is not the last '%", test_string[i], "%'")

  } else{
    paste0("This IS the LAST '%", test_string[i], "%'")
  }
  print(answer) 
  i <- i+1
}

您将获得所需的结果:

[1] "This is not the last '%test%'"
[1] "This is not the last '%test2%'"
[1] "This IS the LAST '%test3%'"

然而我认为有必要注意到常见的for等循环在R中通常比较慢。有很多方法可以让它以“Rly”的方式访问矢量化函数的值...
下面是一个以R为底数的例子:

answer2 <- paste0("This is not the last '%", test_string, "%'")

answer2[length(answer)] <- paste0("This IS the LAST '%", test_string[length(answer)], "%'")
answer2

这将为您提供一个向量结果:

[1] "This IS the LAST '%test%'"      "This is not the last '%test2%'"
[3] "This is not the last '%test3%'"

这段代码更短、更快、更清晰,便于以后在R中编辑。

相关问题