【问题标题】:Sapply processing extra duplicate block of dataSapply 处理额外的重复数据块
【发布时间】:2017-09-01 23:57:46
【问题描述】:

我已经在 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() 函数非常陌生。我确信有更好的方法来做我正在做的事情,但现在我只是想找出这个错误的根源。

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    sapply 返回值;这就是函数的全部意义所在。您在循环内打印内容,最后 R 控制台将打印整个 sapply 的返回值,这是函数各个应用程序结果的列表(或向量)。如果要重复使用,请将输出存储在变量中。

    如果您只需要打印而不对变量执行任何操作,则可以只使用for 循环而不是应用函数。

    【讨论】:

      【解决方案2】:

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

      对于后者,每次在控制台中按回车,如果结果没有被定向到变量中,它就会被偷偷发送到print

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-22
        • 1970-01-01
        • 2011-06-23
        • 1970-01-01
        相关资源
        最近更新 更多