У меня есть функция, которая позволяет много аргументов, и чтобы упростить задачу, я решил включить другую переменную, где аргументы вводятся в виде списка (в приведенном ниже примере - args
).Перезаписать аргументы внутри функции
foo <- function(x, a, b, c, args, ...) {
ifelse(missing(a)==TRUE, a<-1, NA)
ifelse(missing(b)==TRUE, b<-2, NA)
ifelse(missing(c)==TRUE, c<-3, NA)
if(missing(args)==FALSE) {
for(i in 1:length(args)) {
tmp <- as.vector(args[[i]])
assign(names(args)[i], get("tmp"))
}
}
# Need something that overwrites "args" when the
# other arguments are specified
print(list(x=x, a=a, b=b, c=c))
}
И функция foo
дает следующее:
foo(0)
$x
[1] 0
$a
[1] 1
$b
[1] 2
$c
[1] 3
Здесь my_args
записывает аргументы профиля.
my_args <- list(a=1, b=1, c=1)
производить:
foo(0, args=my_args)
$x
[1] 0
$a
[1] 1
$b
[1] 1
$c
[1] 1
Я хотел бы найти способ, чтобы перезаписать значения в args
всякий раз, когда соответствующие аргументы указаны в функции. Хотя пользователь указал два разных значения для одного и того же аргумента, есть обстоятельства, в которых это имеет смысл.
Например,
foo(0, args=my_args, c=3)
$x
[1] 0
$a
[1] 1
$b
[1] 1
$c
[1] 3
И это, чтобы увидеть, что происходит, когда c=3
в профиле, записанной в my_args
.
Я очень ценю некоторую помощь.
простая мысль, имеющий дополнительный, если() проверяет, если оба (а/б/с или арг) не являются пропавшими без вести и затем установить в соответствии с вас выбор. –
@ joel.wilson Я пробовал несколько условных обозначений, включая 'if (! (Существует (имена (args) [i])))' и 'if (missing (substitute (names (args) [i])))' без успеха , но я увижу с опцией оба (a/b/c или args). Спасибо – JARO
Я бы определил 'function (x, a = NA, b = NA, c = NA, args = list (a = a, b = b, c = c), ...)' и использовать только 'args 'в функции. – Roland