Tôi đang cố gắng kiểm tra xem tất cả các phần tử của vectơ có bằng nhau hay không. Các giải pháp tôi đưa ra có vẻ hơi vòng vo, cả hai đều liên quan đến việc kiểm tra length()
.
x <- c(1, 2, 3, 4, 5, 6, 1) # FALSE
y <- rep(2, times = 7) # TRUE
Với unique()
:
length(unique(x)) == 1
length(unique(y)) == 1
Với rle()
:
length(rle(x)$values) == 1
length(rle(y)$values) == 1
Một giải pháp cho phép tôi bao gồm một giá trị dung sai để đánh giá 'sự bình đẳng' giữa các phần tử sẽ là lý tưởng để tránh các vấn đề Câu hỏi thường gặp 7.31 .
Có một chức năng tích hợp cho loại bài kiểm tra mà tôi đã hoàn toàn bỏ qua không? identical()
và all.equal()
so sánh hai đối tượng R, vì vậy chúng sẽ không hoạt động ở đây.
Chỉnh sửa 1
Dưới đây là một số kết quả điểm chuẩn. Sử dụng mã:
library(rbenchmark)
John <- function() all( abs(x - mean(x)) < .Machine$double.eps ^ 0.5 )
DWin <- function() {diff(range(x)) < .Machine$double.eps ^ 0.5}
zero_range <- function() {
if (length(x) == 1) return(TRUE)
x <- range(x) / mean(x)
isTRUE(all.equal(x[1], x[2], tolerance = .Machine$double.eps ^ 0.5))
}
x <- runif(500000);
benchmark(John(), DWin(), zero_range(),
columns=c("test", "replications", "elapsed", "relative"),
order="relative", replications = 10000)
Với kết quả:
test replications elapsed relative
2 DWin() 10000 109.415 1.000000
3 zero_range() 10000 126.912 1.159914
1 John() 10000 208.463 1.905251
Vì vậy, nó có vẻ như diff(range(x)) < .Machine$double.eps ^ 0.5
là nhanh nhất.