Ответ 1
Измените определение multiply, чтобы принять дополнительные неизвестные аргументы:
multiply <- function(a, b, ...) {
# Original code
}
В R
, возможно ли, чтобы программное обеспечение игнорировало тот факт, что существуют неиспользуемые аргументы, определенные при запуске модуля?
Например, у меня есть модуль multiply(a,b)
, который возвращает произведение a
и b
. Я получу ошибку, если я вызову модуль следующим образом:
multiply(a=20,b=30,c=10)
Возврат ошибки на этом просто кажется ненужным, поскольку указаны требуемые входы a
и b
. Можно ли избежать этого плохого поведения?
Простое решение - просто прекратить указывать c
, но это не отвечает, почему R
ведет себя так. Есть ли другой способ решить эту проблему?
Измените определение multiply, чтобы принять дополнительные неизвестные аргументы:
multiply <- function(a, b, ...) {
# Original code
}
Один подход (который я не могу себе представить, это хорошая практика программирования) заключается в добавлении ...
, который традиционно используется для передачи аргументов, указанных в одной функции, другой.
> 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
Вы можете узнать больше о ...
, который предполагается использовать здесь
В определении функции можно использовать точки: ...
.
myfun <- function(a, b, ...){
cat(a,b)
}
myfun(a=4,b=7,hello=3)
# 4 7
У меня была такая же проблема, как и вы. У меня был длинный список аргументов, большинство из которых были неактуальны. Я не хотел их жестко кодировать. Вот что я придумал
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