2012-07-02 37 views
9

Tôi nhận được kết quả không mong muốn từ phương thức all.equal trong R, cụ thể là việc triển khai cho POSIXct, all.equal.POSIXct.Đầu ra không mong đợi từ all.equal.POSIXct

t <- Sys.time() 
isTRUE(all.equal(t, t+1)) 

trả về TRUE, và

isTRUE(all.equal(t, t+1, scale = 1)) 

trả về FALSE.

Tuy nhiên, nếu bạn nhìn vào định nghĩa của all.equal.POSIXct, bạn có thể thấy rằng các thông số quy mô có mặc định là 1:

> all.equal.POSIXct 
function (target, current, ..., scale = 1) 
{ 
    check_tzones(target, current) 
    NextMethod("all.equal") 
} 
<bytecode: 0x22eac90> 
<environment: namespace:base> 

Bạn nhận được kết quả tương tự nếu bạn gọi một cách rõ ràng tất cả. bằng.POSIXct thay vì all.equal.

Tại sao thang điểm thông số mặc định = 1 không được chọn trong cuộc gọi đầu tiên tới all.equal.POSIXct? Tôi đang làm điều gì đó sai, hoặc có cơ bản tôi hiểu lầm một cái gì đó, hoặc là một lỗi này?

Cảm ơn trước vì đã được trợ giúp.

+0

Đây là một câu hỏi hay. Cả hai câu trả lời dưới đây cho thấy đây có thể là lỗi, vì vậy tôi đã gửi báo cáo lỗi tại https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14969 – Andrie

+0

Thật tuyệt, cảm ơn bạn đã gửi báo cáo lỗi! Tôi vừa định làm như vậy! – Ash

Trả lời

7

tôi sẽ ra ở cánh một chút ở đây, nhưng tôi nghĩ bạn đã phát hiện ra một lỗi.

Dưới đây là sửa chữa đề nghị của tôi:

all.equal.POSIXct <- function (target, current, ..., scale = 1) { 
    check_tzones(target, current) 
    NextMethod("all.equal", scale=scale, ...) 
} 

Sau đó, chức năng này cho kết quả chính xác:

all.equal(t, t+1) 
[1] "Mean scaled difference: 1" 

all.equal(t, t+1, scale=10) 
[1] "Mean scaled difference: 0.1" 

Đây là lý do tại sao mã hiện không hoạt động:

Định nghĩa cho all.equal là:

all.equal <- function (target, current, ...) UseMethod("all.equal") 
  • Chú ý rằng có ba đối số: target, current....

  • Do đó, bất cứ khi nào bạn sử dụng NextMethod ba đối số này sẽ được chuyển sang phương pháp tiếp theo.

  • Tuy nhiên, trong trường hợp all.equal.POSIXct, có một đối số bổ sung scale=, nhưng điều này không được chuyển hoàn toàn hoặc rõ ràng.

6

Trông giống như một lỗi. Tôi không phải là một chuyên gia về phương pháp công văn, nhưng đọc nhanh ?NextMethod gợi ý scale=scale cần phải được bổ sung vào NextMethod cuộc gọi trong all.equal.POSIXct:

all.equal.POSIXct <- 
function (target, current, ..., scale = 1) 
{ 
    check_tzones(target, current) 
    NextMethod("all.equal", scale=scale) 
} 
Các vấn đề liên quan