繁体   English   中英

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

[英]How to check if a function is in a vector in R?

我想做pnorm %in% c(pnorm, pt, pchisq) ,但这不起作用。

我该怎么做呢?

使用purrr的解决方案:

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

导致错误:

匹配错误(x,table,nomatch = 0L):'match'需要向量参数

确实%in%调用match并且?match告诉我们(稍微重新格式化):

x :vector或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

这两种方法并不严格等同,但因为相同更严格并且会检查环境,而第一种解决方案只检查参数和正文(即as.list(fun)),的输出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
`%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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM