R 控制台输出仅显示 "if" 条件下的最新命令

R console output only shows most recent command in "if" condition

如果我在 RStudio 中 运行 这段代码:


sprintf("1 + 1 is: %d", 1+1)
sprintf("2 + 2 is:  %d", 2+2)

if (1){
  sprintf("1 + 1 is: %d", 1+1)
  sprintf("2 + 2 is:  %d", 2+2)
}

我得到这个输出:

> sprintf("1 + 1 is: %d", 1+1)
[1] "1 + 1 is: 2"
> sprintf("2 + 2 is:  %d", 2+2)
[1] "2 + 2 is:  4"
> 
> if (1){
+   sprintf("1 + 1 is: %d", 1+1)
+   sprintf("2 + 2 is:  %d", 2+2)
+ }
[1] "2 + 2 is:  4"

我的问题是为什么 if(1) 条件中的第一个打印语句(即 1+1 行)也没有打印到控制台?似乎每当我有一个带有多行输出的“if”条件时,我想打印或绘制,只有最后一行出现。在这些情况下,如何修复它以便“if”语句中的所有代码输出都出现在控制台中?

这在 https://stat.ethz.ch/pipermail/r-help/2011-February/268969.html 上有更详细的讨论。

本质上 sprintf() 实际上并没有向终端打印任何东西,它只是调用一个函数 returns r 中的一个字符串。 (通常 R 在未分配给终端时打印返回的对象,因此是通常的行为)。在诸如此 if 语句或函数调用之类的控制块内,此行为是不同的。在这些块中,R 仅打印一个对象,即返回的对象。在 if 语句中,这是最后一个对象。

要获得您想要的行为,sprintf() 可以包含在 cat()print() 语句中。

另一种方法是结合使用 print()paste() 函数。

所有这些行为都已在下面的表示中进行了总结。

sprintf("1 + 1 is: %d \n", 1+1)
#> [1] "1 + 1 is: 2 \n"
sprintf("2 + 2 is:  %d", 2+2)
#> [1] "2 + 2 is:  4"


if (1){
    sprintf("1 + 1 is: %d \n", 1+1)
    sprintf("2 + 2 is:  %d", 2+2)
}
#> [1] "2 + 2 is:  4"

if (1){
  cat(sprintf("1 + 1 is: %d \n", 1+1))
  print(sprintf("2 + 2 is:  %d", 2+2))
  sprintf("2 + 2 is:  %d", 3+3)
}
#> 1 + 1 is: 2 
#> [1] "2 + 2 is:  4"
#> [1] "2 + 2 is:  6"


if(1) {
  print(paste("1 + 1 is:", 1 + 1))
  print(paste("2 + 2 is:", 2 + 2))
}
#> [1] "1 + 1 is: 2"
#> [1] "2 + 2 is: 4"

reprex package (v2.0.0)

于 2021-04-06 创建