Как проверить, есть ли функция в векторе в R? - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу сделать что-то вроде pnorm %in% c(pnorm, pt, pchisq), но это не работает.

Что я мог бы сделать вместо этого?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Раствор с мурлыканьем:

has_element(c(pt,pnorm,pchisq),pnorm)
#[1] TRUE
has_element(c(pt,pchisq),pnorm)
#[1] FALSE
0 голосов
/ 01 октября 2018
pnorm %in% c(pnorm, pt, pchisq)

приводит к ошибке:

Ошибка в совпадении (x, таблица, nomatch = 0L): для 'match' требуются аргументы вектора

Действительно %in% вызывает match и ?match говорит нам (слегка переформатированный):

x : вектор или NULL: значения для сопоставления.

Мы можем заставить это работать, сделав вашу функцию списком из 1 элемента:

list(pnorm) %in% c(pnorm, pt, pchisq)
# [1] TRUE

Однако, более идиотский способ сделать то, что вы хотите, - применить функцию, идентичную вашему списку функций, это будетЗацикливайте элементы вашей функции и проверяйте для каждого из них, идентичен ли он pnorm:

sapply(c(pnorm, pt, pchisq), identical, pnorm)
# [1]  TRUE FALSE FALSE

Чтобы получить желаемый результат, оберните его в любой:

any(sapply(c(pnorm, pt, pchisq), identical, pnorm))
# [1] TRUE

Эти 2 метода не строго эквивалентны, однако, потому что идентичные более строгие и будут проверять среду, в то время как первое решение будет проверять только аргументы и тело (то есть вывод as.list(fun)), см:

pnorm2 <- function (q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) 
  .Call(C_pnorm, q, mean, sd, lower.tail, log.p)

environment(pnorm2)
# <environment: R_GlobalEnv>
environment(pnorm)
# <environment: namespace:stats>

any(sapply(c(pnorm, pt, pchisq), identical, pnorm2))
# [1] FALSE
list(pnorm2) %in% c(pnorm, pt, pchisq)
# [1] TRUE
0 голосов
/ 28 сентября 2018
`%inl%` <- function(z,l) !is.null(Find(function(x) identical(x,z),l))
pnorm %inl% c(pt,pchisq)
#[1] FALSE
pnorm %inl% c(pt,pnorm,pchisq)
#[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...