pmin给出了错误的答案

问题描述:

pmin在以下示例中未返回相应的输出。pmin给出了错误的答案

eps <- 1e-16 
x <- structure(list(X = c(0.219801587301587, 0.340792857142857, 0.398129365079365, 
         1, 1, 0.853353968253968, 0.930726984126984, 0.980263131313131, 
         0.968269047619047, 0.953053336369513, 1, 1, 1, 0.951969003219003, 
         0.91514335177894, 0.884824997224998, 0.884824997224998, 0.884824997224998)), row.names = c(NA, 18L), class = "data.frame", .Names = "X") 

pmin(x, 1 - eps) 

函数错误地返回NA其中x值为1。如果有这样的报告为一个错误?

+0

这似乎是一个奇怪的结果充其量和我确认我得到同样的事情。像'pmin(data.frame(a = 1:3,b = 3:5),1)'对我来说没什么意义,特别是当'pmin(data.frame(a = 1:3,b = 3: 5),1:3)'出错。看起来并不理想。 – thelatemail

+0

让我们真正打破它 - 'pmin(data.frame(a = 1:3,b = 3:5),data.frame(a = c(1,1,1)))' – thelatemail

+0

提示:你正在寻找为'do.call'。 –

所以我想通了,这是因为xdata.frame和pmin期待一个向量。所以下面的工作很好:

pmin(x[,1], 1 - eps) 

但我想明白为什么它不适用于data.frame。因此,通过代码去为pmin违规线以下:

mmm[change] <- each[change] 

因为each指常数(1 - eps在这种情况下)和changeeach[1]其他逻辑矢量任何会返回NA。而其中x是一个向量的情况下,执行在函数的开头:

if (all(vapply(elts, function(x) is.atomic(x) && !is.object(x), NA))) { 
     mmm <- .Internal(pmin(na.rm, ...)) 
     mostattributes(mmm) <- attributes(elts[[1L]]) 
    } 

似乎代码的那部分是用于当用于pmin的值是矢量和后半部取的情况下的护理在那里你可能有data.frame,但在这种情况下失败。

+0

这比一行更深一点。 'each'重复长度为'mmm':'each Gregor

+1

这很棘手,'pmin'似乎被设计为对称工作,'pmin(x,y)'和'pmin(y,x)'返回相同的结果。我认为公平地说,它从来没有打算用于数据框架 - 尽管抛出一个错误而不是一个混乱的结果可能会更好。 – Gregor

+0

@格雷戈尔 - 那将是我的想法。如果它不是两个(或n个)向量,或者两个(或n个)完全相同维度的data.frames/matrices,它应该抛出一个错误。 – thelatemail