Sapply处理额外的重复数据块

时间:2017-09-01 15:51:29

标签: r sapply

我在R中构建了一个模型,我试图使用sapply()进行测试(我知道这可能看起来很奇怪 - 这是由于模型将如何部署的特殊性)。然而,在处理这个功能时,我偶然发现sapply()的一个奇怪的,有问题的行为。这是代码:

sapply(1:nrow(test_x), function(i) {
  print(i)
  print(test_x[i,]$Age)
  # actual functionality here... 
  }
)

首先,输出是正常的,然后在最后一行重新打印整个列:

[1] 1
[1] 71
[1] 2
[1] 71
[1] 3
[1] 55
...
[1] 5506
[1] 37
[1] 5507
[1] 65
[1] 71 71 55 62 61 68 69 62 62 52 43 52 57 42 41 48 53 60 38
[20] 56 58 63 68 46 60 43 60 52 54 56 41 41 40 55 70 61 64 42 ... 

等等。有没有遇到过这个?我对R和apply()函数都很陌生。我确信有更好的方法可以做我正在做的事情,但是现在我只是想找到这个bug的底部。

2 个答案:

答案 0 :(得分:1)

sapply返回值;这是功能的全部要点。你在循环中打印东西,最后R控制台将打印整个sapply的返回值,它是函数各个应用程序结果的列表(或向量)。如果要重用它,请将输出存储在变量中。

如果您只需要打印而不对变量做任何事情,您只需使用for循环而不是应用函数。

答案 1 :(得分:0)

print返回它打印的值(至少对于原子向量)。由于第二个print调用是函数中的最后一个命令,print的返回值用作函数的返回值。因此,对于i的每次通话,sapply正在收集test_x[i,]$Age,并将其返回给您。当你以交互方式执行它时(我假设),它会被打印出来。

对于后者,每次在控制台中输入enter,如果结果未定向到变量,则会秘密地发送到print

> length(letters)
[1] 26
> print(length(letters))
[1] 26

重申一下,sapply的输出将打印到屏幕上。这就是你第二次看到它的原因。