print()函数在for循环中的作用

时间:2017-09-22 21:03:19

标签: r for-loop

我在这里有一个关于for循环中print()的问题。

我有一个包含2列的数据集(gpa)。我试图获得两列内的值的均值,方差和标准差。当我编码时,

for(x in c(1:2)) {
    mean(gpa[[x]])
    var(gpa[[x]])
    sd(gpa[[x]])
}

我没有得到任何输出:

for(x in c(1:2)) {
    print(mean(gpa[[x]]))
    print(var(gpa[[x]]))
    print(sd(gpa[[x]]))
} 

但如果我在每行之前插入print,我会得到所需的值。 这有什么区别?印刷真的有必要吗?

1 个答案:

答案 0 :(得分:1)

这样做的原因是,循环中的所有内容都会被评估,但永远不会返回到某个地方。虽然print提供的东西我不建议,因为你以后不能使用这些值,因为它们会返回到控制台而不是全局环境。相反,你可能想要将它们分配给某些东西。 例如:

#example data
df <- data.frame(x = 1:10, y = rnorm(10))
#it is good to create the output in the desired length first
#it is much more efficient in terms of speed an memory beeing used but here it don't really matter
ret <- vector("list", NCOL(df)) 

for(x in seq_len(NCOL(df))){
  ret[[x]] <- c(mean(df[[x]]),
    var(df[[x]]),
    sd(df[[x]]))
}
ret

虽然我也没有建议。对于大多数(如果不是全部的话)你可以使用for循环,你可以使用base r中的apply系列函数或purrr的map函数。这看起来就是这样:

library(purrr)
map(df, ~c(mean(.), var(.), sd(.)))
#or even save it with names
ret <- map(df, ~c(mean = mean(.), var = var(.), sd = sd(.)))
ret

应用/地图变体更快&amp;更短,但更重要的是让我更容易理解并且错误的空间更小。虽然还有一堆其他论据,但为什么你可能想要使用apply / map。