Перегрузка как логическая в базе R - PullRequest
1 голос
/ 19 февраля 2020

Я хочу упростить небольшой текстовый код. Аргументы по умолчанию для программы - символ 0 длины, когда эта функция не должна использоваться Меня интересует нечто более простое, чем

if (nchar(expr) > 0) ...

Поэтому я создал следующее

as.logical <- function(x, ...) UseMethod("as.logical")
as.logical.default <- function (x, ...)  base::as.logical(x, ...)
as.logical.character <- function (x, ...) nchar(x) > 0

Если я попробую несколько примеров в командной строке, это сработает

> as.logical(letters)
 [1] TRUE TRUE TRUE ...

Но, что интересно, cond «логический» вектор не пытается применить as.logical. Кажется, он используется в других случаях, как показано ниже:

> if (1) print('Has')
[1] "Has"
> if ('Has') print(1)
Error in if ("Has") print(1) : argument is not interpretable as logical

Как cond оценивает и не может ли я обмануть его с помощью моей функции?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Глядя на источник, базовый оператор R if не делает неявного принуждения к логическому в общем случае c. Вот код . Он вызывает asLogical в коде C выражения, но эта версия asLogical не выполняет обобщенную c диспетчеризацию (поскольку значение по умолчанию as.logical не является обобщенным c). Если передается символьная строка, она будет запускаться только LogicalFromString , которая распознает только жестко закодированное ограниченное количество строк как ИСТИНА : "T", "True", "ИСТИНА" , "правда". Невозможно изменить это поведение в пользовательском пространстве, если только вы не захотите написать что-то типа функции «если» (вы не можете написать свои собственные операторы).

0 голосов
/ 16 марта 2020

Повторяя ответ мистера Флика, что обертка нужна. Это как раз такая оболочка, которая, похоже, решает проблему:

newif <- function(cond, expr) {
  answer <- as.logical(eval(cond))
  if (answer) {
    invisible(eval(expr))
  }
}

> newif('Has', print(1))
[1] 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...