Создание функции в R с переменным числом * named * arguments - PullRequest
0 голосов
/ 13 апреля 2020

В R можно создать функцию с переменным числом аргументов, используя ..., как показано здесь .

Однако я хотел бы иметь функцию с переменной количество именованных (формальных) аргументов. В качестве минимального примера, что-то вроде

f_nargs <- function(n) {

  # process argument n
  # ...
  f(x1, ..., xn) # What should this be ?
}

Как мне этого достичь?


Общая цель - использовать функцию (al) в пакете. Эта функция (al) требует в качестве входных данных функцию с 3 формальными аргументами. Хотя я мог бы написать функцию специально для n = 3, мне любопытно, можно ли это сделать для общего n.


Edit : Вот что я имею в виду:

Моя текущая функция - f(x), где x - вектор длины 3.

Я хотел бы преобразовать это в f(x1, x2, x3) перед передачей его функционалу в пакете , Этот функционал проверяет, если length(formals(f))==3.

В настоящее время я передаю f в

split_args3 <- function(f) {
  force(f)
  function(x1, x2, x3, ...) {
    f(c(x1, x2, x3), ...)
  }
}

Это работает, но только для определенного c n. Затем я попытался использовать

split_args <- function(f, d) {
  force(f)
  force(d)
  function(...) {
    dots <- list(...)
    arg1 <- do.call(c, dots[1:d])
    do.call(f, append(list(arg1), dots[-(1:d)]) )
  }
}

, но он не прошел проверку в функционале.

1 Ответ

0 голосов
/ 13 апреля 2020

Измените список аргументов, как вам нравится, затем передайте его в do.call:

split_args <- function(f, d) {
    force(f)
    force(d)
    function(...) {
        dots <- list(...)
        dots <- c(list(unlist(dots[seq(d)])), dots[-seq(d)])
        do.call(f, dots)
    }
}

mean3 <- split_args(mean, 3)
mean3(2, NA, 3, na.rm = TRUE)
#> [1] 2.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...