[英]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.