Оценка комбинированной строки, включая NA - PullRequest
0 голосов
/ 10 мая 2019

Моя цель - код TRUE / FALSE для оценки строки, сгенерированной путем вставки трехсимвольных ячеек.Вот что у меня есть.

cond.var<-"a"
relation<-"!="
cond.value<-"1"  
a<-1

as.numeric(eval(parse(text=paste(cond.var, relation, cond.value, sep=""))))

Приведенные выше коды работают, когда число сохраняется в cond.value.Последняя строка возвращает 0, что правильно.Тем не менее, когда NA хранится в cond.value (cond.value <- «NA»), последняя строка возвращает просто NA, что неверно.</p>

Будем благодарны за любые предложения по решению этой проблемы.Спасибо.

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Довольно хакерски, но это будет работать без изменения настроек (используя magrittr -pipe для улучшения читабельности)

library(magrittr)

paste("`", relation, "`(", cond.var, ", ", cond.value, ")", sep="") %>% 
    sub(paste0(cond.var, ", NA)"), paste0("is.na(", cond.var, "), TRUE)"), .) %>% 
    parse(text=.) %>% 
    eval() %>% 
    as.numeric()
0 голосов
/ 11 мая 2019

Предпосылка вашего вопроса (что a != NA возврат NA неверен) на самом деле неверна.

NA буквально «недоступен». Не TRUE или FALSE, но неизвестно. Поэтому, если я спрошу вас, «неизвестное значение равно 1?» ваш ответ будет вполне обоснованным: «Неизвестно». Большинство логических операций со значением NA, таких как запрос, равен ли NA 1, возвращают NA (есть некоторые исключения, такие как очевидные is.na(NA) или identical(NA, NA), как упомянуто в другом ответе).

Таким образом, если NA подключен к вашему исходному коду:

cond.var<-"a"
relation<-"!="
cond.value<-"NA"  
a<-1

as.numeric(eval(parse(text=paste(cond.var, relation, cond.value, sep=""))))

... эта последняя команда должна фактически возвращать NA. Ваш код работает просто отлично.

0 голосов
/ 10 мая 2019

Вы можете использовать другую функцию для сравнения, идентичны ли два элемента, например, identical()

> identical(1, 1)
TRUE
> identical(1, NA)
FALSE
> identical(1, 0)
FALSE
> identical(NA, NA)
TRUE

Хотя это делает переменную relation чуть менее универсальной для использования.

Таким образом, полное решение будет:

cond.var<-"a"
relation<-"!identical"
cond.value<-"1"  
a<-1

as.numeric(eval(parse(text=paste0(relation, '(', cond.var, ',', cond.value, ')'))))
...