我构建了一个函数,当其中一个参数在代码中进行了硬编码时,该函数就可以工作,但是一旦将其包含在参数列表中,我就会得到一个错误..很简单,我意识到,但我很沮丧!
## 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)
答案 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"