【问题标题】:How can I write a function in the same way they are written in standard library?如何以与标准库中编写的相同方式编写函数?
【发布时间】:2017-10-02 19:36:57
【问题描述】:

编辑:虽然这个问题与许多统计学专业的学生有关(尤其是那些有其他编程语言经验的学生),但它已被关闭。不过,给出的提示非常有帮助。可以使用 ifelse 函数,如下所示:

qbern24 <- function(x, p) {
        ifelse(x <= 0, -Inf,
               ifelse(x > 0 & x <= 1-p, 0,
                  ifelse(x > 1-p & x <= 1, 1,
                     Inf)
                  )
               )
}

如果你想矢量化其他东西,祝你好运。

/编辑

标准库中的函数将采用“数字向量”并返回数字向量,但我的没有。如何编写 qbern04 以便可以像使用 qnorm 一样使用它,而不必使用 as.numeric 和 lapply?

    qbern <- function(x, p) {
            if (x <= 0) {
                    -Inf
            } else if (x > 0 & x <= 1-p) {
                    0
            } else if (x > 1-p & x <= 1) {
                    1
            } else {
                    Inf
            }
    }


    qbern04 <- function(x) {
                    qbern(x, 0.4)
    }

    U <- runif(1e6)
    X <- as.numeric(lapply(U, qbern04))
    Z <- qnorm(U)

【问题讨论】:

  • 矢量化你的函数,参见?vector?`[`等。

标签: r


【解决方案1】:
qbern <- function(x, p) {
  OTHERWISE <- TRUE
  dplyr::case_when(
                     (x <= 0) ~ -Inf,
    ((x > 0) && (x <= (1-p))) ~ 0,
      ((x > 1-p) && (x <= 1)) ~ 1,
                    OTHERWISE ~ Inf
  )
}

qbern04 <- function(x) { qbern(x, 0.4) }

case_when() 来自dplyr。如果您不想要这种依赖,请阅读矢量化并学习使用 ifelse()sapply()vapply(),因为 lapply() 旨在返回 lists。

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 2018-08-12
    • 2017-05-30
    • 1970-01-01
    • 2020-01-28
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多