2013-04-22 31 views
9

Tôi không cố gắng giải quyết bất kỳ vấn đề cụ thể nào, nhưng cố gắng tìm hiểu R và hiểu toán tử phủ định hợp lý của nó "!" tài liệu trên trang http://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.htmlToán tử phủ định hợp lý "!" hoạt động

Nó hoạt động đối với tôi khi được sử dụng kết hợp với =, trong các biểu thức như:

1 != 2 
TRUE 

Nhưng tôi không thể khá hiểu ứng dụng độc lập của toán tử này. Ví dụ, tôi có thể sử dụng nó để chọn các phần tử trong danh sách không có tên cụ thể. Đây là nỗ lực của tôi để làm điều đó, nhưng nó đã không làm việc:

vector1 <- 1:5 # just making vector of 5 numbers 
vector2 <- 5:1 # same vector backwards 
list <- list(Forward=vector1, Backwards=vector2) # producing list with two elements 
x = "Forward" 
list[!x] 

đầu ra của tôi là:

Error in !x : invalid argument type 

Sẽ đánh giá cao bất kỳ gợi ý về nơi logic của tôi gặp khó khăn trong trường hợp này, và khác tốt là gì sử dụng của toán tử này ngoại trừ! = case.

Cảm ơn! Sergey

Trả lời

13

Đầu tiên, tốt nhất là không nên nghĩ đến !=! hoạt động trên =, mà đúng hơn là một toán tử nhị phân riêng biệt hoàn toàn.

Nói chung, ! chỉ nên được áp dụng cho các vectơ boolean. Vì vậy, điều này có lẽ giống như những gì bạn đang sau:

vector1 <- 1:5 # just making vector of 5 numbers 
vector2 <- 5:1 # same vector backwards 
l <- list(Forward=vector1, Backwards=vector2) # producing list with two elements 
x = "Forward" 
l[!(names(l) %in% x)] 

nơi names(l) %in% x trả về một vector boolean dọc theo tên của danh sách l chỉ ra cho dù họ đang chứa trong x hay không. Cuối cùng, tôi tránh sử dụng list làm biến, vì bạn có thể thấy nó là một hàm khá phổ biến.

+0

joran, cảm ơn rất nhiều vì đã giải thích và giải thích, tất cả đều hợp lý với tôi ngay bây giờ. –

8

Trước tiên, tôi nghĩ rằng ! trong != không phải là toán tử !. Nó là một toán tử riêng biệt, !=, có nghĩa là "khác với".

Thứ hai, các nhà điều hành ! là một logic, sự phủ định logic, và nó phải được áp dụng cho một vector logic:

R> !(c(TRUE,FALSE)) 
[1] FALSE TRUE 

Là con số có thể bị cưỡng chế hợp lý, nó cũng có thể được áp dụng cho một vector số. Trong trường hợp này 0 sẽ được coi là FALSE và bất kỳ giá trị khác như TRUE:

R> !c(1,0,-2.5) 
[1] FALSE TRUE FALSE 

Trong ví dụ của bạn, bạn đang cố gắng áp dụng toán tử logic này cho một chuỗi ký tự, trong đó đặt ra một lỗi.

Nếu bạn muốn đặt danh sách, khung dữ liệu hoặc vectơ theo tên, chỉ mục hoặc điều kiện, bạn nên đọc và tìm hiểu về phần lập chỉ mục của ngôn ngữ R, được mô tả trong sách hướng dẫn R và hầu hết các sách giới thiệu và các tài liệu.

Một cách để tập hợp con một danh sách bằng tên có thể được, ví dụ:

R> list[!(names(list) %in% "Forward")] 
$Backwards 
[1] 5 4 3 2 1 
9

Tôi đồng ý với tất cả mọi thứ cho biết do hai áp phích khác, nhưng muốn thêm một điều nữa tôi luôn nói khi dạy R.

R hoạt động ở chỗ nó đánh giá các câu lệnh từ bên trong ra bên ngoài và mỗi câu lệnh đó cần phải tự chạy. Nếu bạn đã có một lỗi trong một tuyên bố bên trong, không có thắc mắc người ngoài không sản xuất bất cứ điều gì.

Trong trường hợp của bạn, người ta có thể nói bạn có hai tuyên bố: !x và truy cập danh sách trên list qua [.

Nếu bạn sao chép hành vi R của bạn nhận thấy rằng !x đã tạo ra lỗi:

> !x 
Error in !x : invalid argument type 

Do đó, các giải pháp đúng cố gắng thay đổi bước này.

Vì vậy: Luôn kiểm tra các phát biểu bên trong nhất khi xảy ra lỗi và tự làm việc ra ngoài.

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