2013-04-22 3 views
9

Я не пытаюсь решить какую-либо конкретную проблему, но пытаюсь изучить R и понять его логический оператор отрицания «!». документированы на странице http://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.htmlКак логический оператор отрицания «!» works

Он работает для меня, когда используется в сочетании с =, в выражениях, таких как:

1 != 2 
TRUE 

Но я не могу вполне понять отдельное приложение этого оператора. Например, я могу использовать его для выбора элементов списка, которые не имеют определенного имени. Вот моя попытка сделать это, но это не сработало:

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] 

Мой вывод:

Error in !x : invalid argument type 

будет признателен за любые подсказки о том, где моя логика идет не так в данном случае, и то, что другие хорошие использования этого оператора, за исключением случая = =.

Спасибо! Сергей

ответ

13

Во-первых, это, вероятно, лучше не думать о том, как !=!, действующей на =, а в качестве отдельного бинарного оператора в целом.

В целом, ! следует применять только к булевым векторам. Так что это, вероятно, больше похоже на то, что вы после:

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)] 

где names(l) %in% x возвращает булево вектор вдоль имен в списке l указывающего, содержатся ли они в x или нет. Наконец, я избежал использования list в качестве переменной, так как вы можете видеть, что это довольно распространенная функция.

+0

joran, спасибо большое за разъяснения и объяснения, все имеет смысл для меня сейчас. –

8

Во-первых, я думаю, что ! в != не является оператором !. Это отличный оператор !=, что означает «отличное от».

Во-вторых, оператор ! является логическим, логическое отрицание, и оно должно быть применено к логическому вектору:

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

Как числа могут быть принуждены к логическим, он также может быть применен к числовой вектор. В этом случае 0 будет рассматриваться как FALSE и любое другое значение, как TRUE:

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

В вашем примере, вы пытаетесь применить этот логический оператор в строку символов, которая вызывает ошибку.

Если вы хотите подмножества списков, кадры данных или векторы по именам, индексам или условиям, вы должны прочитать и узнать об индексирующей части языка R, которая описана в руководствах R и большинстве вводных книг и документы.

Один из способов Подмножества списка с сортировкой по имени может быть, например:

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

Я согласен со всем, что от двух других плакатов, но хочу добавить еще одну вещи, я всегда говорю, обучая R.

R работает в том, что он оценивает операторы изнутри наружу, и каждое из этих утверждений должно запускаться самостоятельно. Если у вас уже есть ошибка во внутреннем заявлении, неудивительно, что нарушители ничего не производят.

В вашем случае можно сказать, что у вас есть два утверждения: !x и список доступа по адресу list через [.

Если повторить поведение R в замечаешь, что !x уже производит ошибку:

> !x 
Error in !x : invalid argument type 

Следовательно, правильные решения попытаться изменить этот шаг.

So: Всегда проверяйте свои самые сокровенные заявления, когда возникают ошибки и работают сами наружу.