简体   繁体   English

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

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

I want to do do something like pnorm %in% c(pnorm, pt, pchisq) , but this doesn't work. 我想做pnorm %in% c(pnorm, pt, pchisq) ,但这不起作用。

What could I do instead? 我该怎么做呢?

A solution with purrr: 使用purrr的解决方案:

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

results in error : 导致错误:

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

Indeed %in% calls match and ?match tells us (slightly reformatted): 确实%in%调用match并且?match告诉我们(稍微重新格式化):

x : vector or NULL: the values to be matched. x :vector或NULL:要匹配的值。

We can make it work by making your function a 1 element list : 我们可以通过使您的函数成为1元素列表来使其工作:

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

However, a more idiomatic way of doing what you want is to apply the function identical on your list of functions, it will loop on your function elements and check for each one if it's identical to pnorm : 但是,更合适的方法是做你想做的事情就是在你的函数列表中应用相同的函数,它将循环你的函数元素并检查每个函数是否与pnorm相同:

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

To get a your desired output, wrap inside any : 要获得所需的输出,请将其包装在内:

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

These 2 methods are not strictly equivalent however because identical is more strict and will check the environment while the first solution will only check the arguments and body (ie the output of as.list(fun)), see : 这两种方法并不严格等同,但因为相同更严格并且会检查环境,而第一种解决方案只检查参数和正文(即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