Какой логичный оператор отрицания! работает

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

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

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

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

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


person Sergey Samusev    schedule 22.04.2013    source источник


Ответы (3)


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

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

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 в качестве переменной, так как вы можете видеть, что это также довольно распространенная функция.

person joran    schedule 22.04.2013
comment
Джоран, большое спасибо за разъяснения и пояснения, теперь для меня все имеет смысл. - person Sergey Samusev; 23.04.2013

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

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

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

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

> !x
Error in !x : invalid argument type

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

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

person Henrik    schedule 22.04.2013

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

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

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
person juba    schedule 22.04.2013