Ваш код в foo(b = 2)
является приложением функции: если все работает как положено, он даст вам значение, а не функцию.
Вы можете изменить значения аргументов по умолчанию, используя formals
:
foo <- function(a, b = 1) {
a + b
}
formals(foo)$b <- 2
foo
#function (a, b = 2)
# {
# a + b
# }
Если вы не хотите изменять foo
напрямую, есть несколько вариантов:
1) Сначала скопируйте, потом измените
foa <- foo
formals(foa)$b <- 42
ОдинМожно подумать об использовании "formals<-"
в качестве ярлыка, но это может быть сложно, поскольку вам нужно предоставить полный список аргументов (используя alist
вместо list
, поскольку первый может принимать пустой аргумент):
"formals<-"(foo, , list(b=2)) # trying it with `list`
function (b = 2) # we lost one argument!
{
a + b
}
"formals<-"(foo, , alist(a=, b=42)) # this one is better!
function (a, b = 42)
{
a + b
}
2) Используйте purr::partial
или function(a) foo(a,b=42)
, как рекомендовано в другом ответе.
3) И третий способ ... на самом деле можно написать очень простую функцию (я назову ее p2
), которая изменяет некоторые аргументов по умолчанию функции ивозвращает измененную функцию:
p2 <- function(f, l){
formals(f)[names(l)] <- l
f
}
p2(foo, list(b=42)) # changing a default: function (a, b = 42) a+b
p2(foo, alist(b=)) # removing a default: function (a, b) a+b
p2(foo, list(c="bingo") # adding an argument: function (a, b = 2, c = "bingo") a+b
Измененную версию:
p3 <- function(f, ...){
l <- as.list(sys.call())[-(1L:2L)] # code from `alist`
formals(f)[names(l)] <- l
f
}
Теперь использование становится короче:
p3(foo, b=43) # function (a, b = 43) a+b
p3(foo, b=) # function(a,b) a+b
Обратите внимание, что p2
и p3
не будет работать должным образом с общими функциями, такими как mean
и min
.Вероятно, это причина того, что код в purrr:partial
намного сложнее.