R, аргумент отсутствует без значения по умолчанию - PullRequest
0 голосов
/ 22 апреля 2020

Я создаю функцию, и она работает, когда один из аргументов жестко запрограммирован в коде, но как только я включаю ее в список аргументов, я получаю сообщение об ошибке ... Я понимаю, что это просто, но это вводит меня в заблуждение!

## 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.numeri c (x)

1 Ответ

2 голосов
/ 22 апреля 2020

Здесь легко запутаться. Вы пишете функцию 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"
...