如何检查函数是否在R中的向量中?

时间:2018-09-28 11:07:58

标签: r list vector

我想做类似pnorm %in% c(pnorm, pt, pchisq)的事情,但这是行不通的。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

使用purrr的解决方案:

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

答案 1 :(得分:1)

pnorm %in% c(pnorm, pt, pchisq)

结果错误:

  

match(x,table,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

答案 2 :(得分:0)

`%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