我在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的底部。
答案 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
的输出将打印到屏幕上。这就是你第二次看到它的原因。