2013-09-23 23 views
6

Trong giao diện điều khiển, đi trước và thửTại sao 1,99,999 == "1" .. "99,999" trong R, nhưng 100.000! = "100.000"?

> sum(sapply(1:99999, function(x) { x != as.character(x) })) 
0 

Đối với tất cả các giá trị từ 1 đến 99999, "1" == 1, "2" == 2 ..., 99999 == "99999"TRUE. Tuy nhiên,

> 100000 == "100000" 
FALSE 

Tại sao R có hành vi kỳ quặc này và đây có phải là lỗi không? Điều gì sẽ là một giải pháp để, ví dụ: kiểm tra xem mọi phần tử trong vectơ ký tự nguyên tử có thực sự là số không? Ngay bây giờ tôi đã cố gắng để kiểm tra xem x == as.numeric(x) cho mỗi x, nhưng điều đó không thành công trên bộ dữ liệu nhất định do vấn đề trên!

+1

Không, tổng đó là zero, không phải "TRUE" ... – Frank

+0

@JoshuaUlrich bạn có thể giải thích cách những trùng lặp? –

+0

Đối với vấn đề được mô tả trong đoạn cuối, bạn có thể 'khớp' vectơ ký tự đầu vào của bạn với '1: 100000' (là một số nguyên vector):' match (as.character (1: 100000), 1: 100000) ' . – Frank

Trả lời

12

Hãy xem as.character(100000). Giá trị của nó không bằng "100000" (có một cái nhìn cho chính mình), và R là cơ bản chỉ nói cho bạn như vậy.

as.character(100000) 
# [1] "1e+05" 

Ở đây, từ ?Comparison, những quy tắc R cho việc áp dụng toán tử quan hệ với các giá trị của các loại khác nhau:

Nếu hai đối số là vectơ nguyên tử của các loại khác nhau, một là cưỡng chế các loại khác, thứ tự (giảm) của ưu tiên là ký tự, số phức, số, số nguyên, lôgic và thô.

Những quy tắc này có nghĩa là khi bạn kiểm tra xem 1=="1", trước tiên R chuyển đổi giá trị số trên LHS thành chuỗi ký tự và sau đó kiểm tra tính bình đẳng của chuỗi ký tự trên LHS và RHS. Trong một số trường hợp, chúng sẽ bằng nhau, nhưng trong những trường hợp khác, chúng sẽ không như vậy. Những trường hợp sản xuất bất bình đẳng sẽ phụ thuộc vào các thiết lập hiện tại của options("scipen")options("digits")

Vì vậy, khi bạn gõ 100000=="100000", nó là như thể bạn đã thực sự thực hiện kiểm tra sau. (Lưu ý rằng trong nội bộ, R có thể cũng/có lẽ sử dụng một cái gì đó khác với as.character() để thực hiện việc chuyển đổi):

as.character(100000)=="100000" 
# [1] FALSE 
+0

Từ '? '=='': "Nếu hai đối số là các vectơ nguyên tử của các loại khác nhau, một là bị ép buộc theo loại khác, thứ tự ưu tiên (giảm dần) là ký tự, phức tạp, số, số nguyên, lô-gic và thô." Vì vậy, nó là chính xác để nói rằng bên LHS là nhận được coereced để nhân vật và không phải là cách khác xung quanh? –

+2

@ SeñorO Trong 'x == y', nếu' y' là ký tự thì 'x' được chuyển đổi, vì vậy nó là * như thể *' as.character (100000) == "100000" 'được gọi. Nó không quan trọng mà bên của toán tử nhị phân này là; miễn là một trong các cặp là nhân vật, người kia sẽ bị ép buộc vào nhân vật nếu chưa được như vậy. –

+0

@GavinSimpson - Cảm ơn bạn đã giải thích rõ. Tôi đã chỉnh sửa một trong số họ (bit về "* như thể *") vào câu trả lời của tôi. –

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