簡體   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