Есть ли встроенная функция в R, чтобы проверить, сохраняется ли тип переменной? - PullRequest
0 голосов
/ 24 апреля 2018

Предположим, у вас есть вход a, который входит в существующую функцию fun.Я ищу функцию preserved(a, fun(a)), которая возвращает TRUE, если тип неизменен, FALSE в противном случае.

Пример:

a <- 1L # [1] 1 - integer
b <- a[FALSE] # integer(0)
c <- a[2] # [1] NA
d <- ncol(a) # NULL
e <- a/0 # [1] Inf
f <- 1 # [1] 1 - numeric
g <- as.factor(a) # [1] 1 Levels: 1

Ожидаемый результат:

preserved(a, 2L) = TRUE
preserved(a, b) = FALSE
preserved(a, c) = FALSE
preserved(a, d) = FALSE
preserved(a, e) = FALSE
preserved(a, f) = FALSE
preserved(a, f) = FALSE
preserved(a, g) = FALSE

Плохой взлом (не векторизованный) будет

preserved <- function(a, b) {
  if (length(b) == length(a)) {
    if (is.na(b) == is.na(a) & 
        class(b) == class(a) &
        is.null(b) == is.null(a) &
        is.nan(b) == is.nan(a) &
        is.factor(b) == is.factor(a)) {
      return(TRUE)
    } else {
      return(FALSE)
    }
  } else {
    return(FALSE)
  }
}

1 Ответ

0 голосов
/ 24 апреля 2018

Если вы просто хотите сравнить два объекта, вы, вероятно, захотите использовать all.equal() или identical(), а не пытаться сгенерировать каждую возможную попарную комбинацию классов (поскольку это число может быть бесконечным).

Нечто, близкое к тому, что вы хотите, может оказаться более полезным, если применить makeActiveBinding() для выдачи сообщений (или предупреждений, или ошибок) при попытке принудительного ввода типа:

# active binding
preserved <- local( {
    x <- NULL
    function(v) {
        if (!missing(v)) {
            if (class(x) != class(v)) {
                message(sprintf("Object is being coerced from %s to %s", class(x), class(v)))
            }
            x <<- v
        }
        x
    }
})
makeActiveBinding("z", preserved, .GlobalEnv)
z
## NULL
z <- 2
## Object is being coerced from NULL to numeric
z <- "hello"
## Object is being coerced from numeric to character
z <- factor("a", levels = c("a", "b", "c"))
## Object is being coerced from character to factor
z
## [1] a
## Levels: a b c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...