আমি ভেক্টরের সমস্ত উপাদান একে অপরের সমান কিনা তা পরীক্ষার চেষ্টা করছি। আমি যে সমাধানগুলি নিয়ে এসেছি সেগুলি কিছুটা চতুর্দিকের মনে হয়, উভয়ই চেক জড়িত length()
।
x <- c(1, 2, 3, 4, 5, 6, 1) # FALSE
y <- rep(2, times = 7) # TRUE
সাথে unique()
:
length(unique(x)) == 1
length(unique(y)) == 1
সাথে rle()
:
length(rle(x)$values) == 1
length(rle(y)$values) == 1
একটি সমাধান যা আমাকে উপাদানগুলির মধ্যে 'সমতা' নির্ধারণের জন্য সহনশীলতার মান অন্তর্ভুক্ত করতে দেয় এফএকিউ 7.31 ইস্যু এড়ানোর জন্য আদর্শ হবে ।
আমি সম্পূর্ণরূপে উপেক্ষা করেছি এমন ধরণের পরীক্ষার জন্য কি কোনও অন্তর্নির্মিত ফাংশন রয়েছে? identical()
এবং all.equal()
দুটি আর বস্তুর তুলনা করুন, সুতরাং তারা এখানে কাজ করবে না।
সম্পাদনা 1
এখানে কিছু বেঞ্চমার্কিং ফলাফল রয়েছে। কোড ব্যবহার করে:
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)
ফলাফল সহ:
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
সুতরাং দেখে মনে হচ্ছে diff(range(x)) < .Machine$double.eps ^ 0.5
এটি দ্রুততম।