Я разрабатываю пакет R, в котором у меня есть экспортированная функция, которая должна вызывать несколько неэкспортированных функций и сохранять результаты каждой из них в списке.
То, какие функции вызываются, является переменным и зависит от ввода пользователя.
Мой подход к этому заключался в lapply
(символьном) векторе имен функций с do.call
, но, похоже, это делает неэкспортированные функции невидимыми для экспортируемой функции.
Рассмотрим следующий пример кода пакета:
tmp1 <- function(x) print(paste("Function 1 called with x =", x))
tmp2 <- function(x) print(paste("Function 2 called with x =", x))
tmp3 <- function(x) print(paste("Function 3 called with x =", x))
#' @export
test1 <- function() {
tmp1("test")
tmp2("test")
tmp3("test")
}
#' @export
test2 <- function() {
funs <- c("tmp1", "tmp2", "tmp3")
for (fun in funs) do.call(fun, list(x = "test"))
}
#' @export
test3 <- function() {
funs <- c("tmp1", "tmp2", "tmp3")
lapply(funs, do.call, list(x = "test"))
}
После сборки и загрузки пакета запуск трех функций test
дает следующий вывод:
test1()
#> [1] "Function 1 called with x = test"
#> [1] "Function 2 called with x = test"
#> [1] "Function 3 called with x = test"
test2()
#> [1] "Function 1 called with x = test"
#> [1] "Function 2 called with x = test"
#> [1] "Function 3 called with x = test"
test3()
#> Error in tmp1(x = "test"): could not find function "tmp1"
Вызов функций напрямую работает, и вызов их с помощью do.call
работает при непосредственном использовании do.call
, но происходит сбой при вызове их через lapply
.
Я могу обойти этот цикл, но мне любопытно, почему это происходит.
Итак, мой вопрос двоякий:
- Почему неэкспортированные функции невидимы для
do.call
при вызове внутри lapply
?
- Можно ли заставить работать
lapply(funs, do.call, list(...))
подход?