«Обновить» некоторые аргументы в пользовательских функциях в R - PullRequest
1 голос
/ 25 марта 2019

Предположим, у нас есть определенная пользователем функция в R со многими (> 20) аргументами функции. Ни один из этих аргументов не имеет предварительно определенных стандартных значений (например, arg1 = 10).

Упрощенный пример:

foo <- function(value, increment){
        value + increment
}

bar <- foo(value = 2, increment = 3)
bar
#> [1] 5

Создано в 2019-03-25 с помощью пакета Представить (v0.2.1)

Вопрос : Существует ли способ «обновлять» только один / несколько аргументов за раз, сохраняя постоянным ввод всех остальных аргументов? Для приведенного выше примера это будет что-то вроде:

update(bar, increment = 8)
#> [1] 10

Обратите внимание, что здесь value = 2, поскольку это уже было указано для объекта bar и только increment изменяется.

1 Ответ

3 голосов
/ 25 марта 2019

Вы можете создать только объект call и изменить его:

library(pryr)

cl <- call("foo",value = 2,increment = 3)
eval(cl) #5

cl_new <- modify_call(cl,list(increment = 8))
eval(cl_new) #10

Здесь я использовал пакет pryr и его функцию modify_call, но если вы проверите код этой функции, вы увидите, что реализовать простую версию самостоятельно довольно просто.

По сути, cl[["increment"]] даст исходное значение в вызове для аргумента increment, поэтому вы можете изменить это или другие значения или добавить новые аргументы в вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...