R,缺少参数且没有默认值

时间:2020-04-22 11:18:35

标签: r function arguments

我构建了一个函数,当其中一个参数在代码中进行了硬编码时,该函数就可以工作,但是一旦将其包含在参数列表中,我就会得到一个错误..很简单,我意识到,但我很沮丧!

## load necessary libraries
library(gsubfn)

## number of days
days <- 5

AdDayFun <- function (inarray) {
    gsubfn("^\\D*\\d+\\D*\\K(\\d+)",
           ~ ifelse(as.numeric(x) < 5,
                    sprintf("%02d",as.numeric(x)+1),
                    "00"),
           inarray,
           perl=TRUE
           )
}

## initial population 
pop <- matrix(c("a-00-04","a-00-00","a-00-00", "dead", "a-00-00"), nrow =1)
pop




pop <- rbind(pop, AdDayFun(pop[nrow(pop), ]))
pop

一切正常,直到我将函数更改为需要两个参数,然后出错?

AdDayFun <- function (inarray, nummax) {
    gsubfn("^\\D*\\d+\\D*\\K(\\d+)",
           ~ ifelse(as.numeric(x) < nummax,
                    sprintf("%02d",as.numeric(x)+1),
                    "00"),
           inarray,
           perl=TRUE
           )
}

(AdDayFun(pop[nrow(pop), ], 7))

这样的错误: ifelse(as.numeric(x)

1 个答案:

答案 0 :(得分:2)

在这里很容易感到困惑。您正在编写一个函数AdDayFun,该函数包装了另一个函数gsubfn,该函数本身使用未命名的函数或公式作为参数。

我们想做的是允许nummax作为参数传递给未命名函数。但是,似乎没有内置方法可以将任意参数传递给该函数。

但是,由于您将gsubfn包装在自己的函数中,因此有一种解决方法,该方法是预定义未命名函数的第二个参数,该参数的默认值为nummax

AdDayFun <- function (inarray, nummax) 
{
  f <- function(x, y = nummax)
  {
    ifelse(as.numeric(x) < y, sprintf("%02d", as.numeric(x) + 1), "00")
  }

  gsubfn("^\\D*\\d+\\D*\\K(\\d+)", f, inarray, perl = TRUE)
}

哪个给出以下结果:

a <- AdDayFun(pop[nrow(pop),], 5)
a
#> [1] "a-00-05" "a-00-01" "a-00-01" "dead"    "a-00-01"

a <- AdDayFun(a, 7)
a
#> [1] "a-00-06" "a-00-02" "a-00-02" "dead"    "a-00-02"

a <- AdDayFun(a, 5)
a
#> [1] "a-00-00" "a-00-03" "a-00-03" "dead"    "a-00-03"