2017-06-23 23 views
6

pmin không trả về kết quả phù hợp trong ví dụ sau.pmin cung cấp câu trả lời sai

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) 

Chức năng không đúng cách trả NA nơi giá trị của x là 1. Nếu điều này được báo cáo là lỗi?

+0

Điều này có vẻ như một kết quả kỳ lạ ở mức tốt nhất và tôi xác nhận rằng tôi nhận được điều tương tự. Một cái gì đó như 'pmin (data.frame (a = 1: 3, b = 3: 5), 1)' có ý nghĩa nhỏ đối với tôi, đặc biệt khi 'pmin (data.frame (a = 1: 3, b = 3: 5), 1: 3) 'lỗi. Có vẻ không lý tưởng. – thelatemail

+0

Hãy thực sự phá vỡ nó - 'pmin (data.frame (a = 1: 3, b = 3: 5), data.frame (a = c (1,1,1)))' – thelatemail

+0

Gợi ý: bạn đang tìm kiếm cho 'do.call'. –

Trả lời

5

Vì vậy, tôi đã tìm ra rằng điều này là do x là một data.frame và pmin đang mong đợi một vectơ. Vì vậy, các công trình sau đây chỉ hoạt động tốt:

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

Nhưng tôi muốn hiểu tại sao nó không hoạt động cho data.frame. Vì vậy, đi qua các mã cho pmin dòng vi phạm được như sau:

mmm[change] <- each[change] 

each đề cập đến hằng số (1 - eps trong trường hợp này) và change là một vector bất cứ điều gì khác hợp lý hơn each[1] sẽ trở lại NA. Trong khi đó, trường hợp x là một vector thực hiện vào đầu của hàm tại địa chỉ:

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

Đó là một phần của mã có vẻ như là để dành cho khi các giá trị cho pmin là vectơ và phần sau sẽ chăm sóc của vụ án nơi bạn có thể có một data.frame, nhưng nó không thành công trong trường hợp đã cho.

+0

Hơi sâu hơn một dòng. 'each' được lặp lại với độ dài' mmm': 'mỗi <- rep (mỗi, length.out = l2)' trong đó 'l2 = length (mmm)' (khi 'mmm' là một khung dữ liệu, đây là số cột). Và 'mỗi' là một' danh sách', không phải là một giá trị. – Gregor

+1

Cũng khó hiểu rằng 'pmin' dường như được thiết kế để hoạt động đối xứng,' pmin (x, y) 'và' pmin (y, x) 'trả về cùng một kết quả. Tôi nghĩ rằng nó công bằng để nói rằng nó không bao giờ được dự định để sử dụng trên khung dữ liệu - mặc dù ném một lỗi chứ không phải là một kết quả khó hiểu có lẽ sẽ tốt hơn. – Gregor

+0

@Gregor - đó sẽ là suy nghĩ của tôi. Nếu nó không phải là hai (hoặc n) vectơ, hoặc hai (hoặc n) data.frames/ma trận của cùng một kích thước chính xác, nó sẽ ném một lỗi. – thelatemail

Các vấn đề liên quan