Подтвердить что ты не робот

Неиспользуемые аргументы в R

В R, возможно ли, чтобы программное обеспечение игнорировало тот факт, что существуют неиспользуемые аргументы, определенные при запуске модуля?

Например, у меня есть модуль multiply(a,b), который возвращает произведение a и b. Я получу ошибку, если я вызову модуль следующим образом:

multiply(a=20,b=30,c=10)

Возврат ошибки на этом просто кажется ненужным, поскольку указаны требуемые входы a и b. Можно ли избежать этого плохого поведения?

Простое решение - просто прекратить указывать c, но это не отвечает, почему R ведет себя так. Есть ли другой способ решить эту проблему?

4b9b3361

Ответ 1

Измените определение multiply, чтобы принять дополнительные неизвестные аргументы:

multiply <- function(a, b, ...) {
  # Original code
}

Ответ 2

Один подход (который я не могу себе представить, это хорошая практика программирования) заключается в добавлении ..., который традиционно используется для передачи аргументов, указанных в одной функции, другой.

> multiply <- function(a,b) a*b
> multiply(a = 2,b = 4,c = 8)
Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8)
> multiply2 <- function(a,b,...) a*b
> multiply2(a = 2,b = 4,c = 8)
[1] 8

Вы можете узнать больше о ..., который предполагается использовать здесь

Ответ 3

В определении функции можно использовать точки: ....

myfun <- function(a, b, ...){
  cat(a,b)
}

myfun(a=4,b=7,hello=3)

# 4 7

Ответ 4

У меня была такая же проблема, как и вы. У меня был длинный список аргументов, большинство из которых были неактуальны. Я не хотел их жестко кодировать. Вот что я придумал

library(magrittr)
do_func_ignore_things <- function(data, what){
    acceptable_args <- data[names(data) %in% (formals(what) %>% names)]
    do.call(what, acceptable_args %>% as.list)
}

do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm")
# -9.230675 -10.503509 -10.927077