【问题标题】:How to check if a function is in a vector in R?如何检查函数是否在R中的向量中?
【发布时间】:2018-09-28 11:07:58
【问题描述】:

我想做pnorm %in% c(pnorm, pt, pchisq)之类的事情,但这不起作用。

我能做些什么呢?

【问题讨论】:

  • sapply(fun_list, identical, x) ?
  • R 也不喜欢比较 pnorm == pnorm
  • @Moody_Mudskipper 来到这里提供同样的建议。你应该写一个我认为的答案。
  • @Moody_Mudskipper 谢谢。你能解释一下identicalx 的参数代表什么吗?
  • 我赞同@duckmayr 的建议,即穆迪应该把它写下来作为答案,也许把它包装在any()

标签: r list vector


【解决方案1】:
pnorm %in% c(pnorm, pt, pchisq)

导致错误:

匹配错误(x, table, nomatch = 0L):“匹配”需要向量 论据

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

x : vector or 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)), 的输出,请参阅:

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】:

    咕噜咕噜的解决方案:

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

    【讨论】:

      【解决方案3】:
      `%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
      

      【讨论】:

      • 对您的答案进行一些解释会非常方便!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多