С помощью '.,«.для двух целей в одной функции R - PullRequest
0 голосов
/ 23 мая 2018

В моей функции ниже я хочу использовать ... для двух целей.Первый ... должен использоваться, чтобы ... мог быть превращен в list(...).Второй ... просто предназначен для представления графических параметров (например, col, font и т.эквивалентная стратегия, чтобы моя функция работала?

bb <- function(..., ...){

aa <- function(x, add){ if(!add) { plot(density(x), ...) } else { lines(density(x), ...) } 
} ## HERE `...` represents graphical parameters

z <- list(...) ## HERE `...` is used to form a list(...)
loop <- seq_len(length(z))

for(i in loop){ aa(z[[i]], add = i != 1, ... = ...) }
}

#When fixed, the function should work in the following example:

y1 <- rnorm(200)
y2 <- rnorm(200)

bb(y1, y2) # Should give two overlapping plots

1 Ответ

0 голосов
/ 23 мая 2018

Не было бы способа разделить аргументы, переданные функции, на два эллипса.Для достижения той же функциональности вы можете заменить один из них аргументом list;в этом случае графические параметры могут быть естественным выбором, но это зависит от вашего предполагаемого варианта использования.

Чтобы иметь возможность вызывать функции с аргументами, указанными в списке, вы можете использовать do.call:

do.call создает и выполняет вызов функции из имени или функции и списка аргументов, которые должны быть ему переданы.

bb <- function(..., gpar = list()) {
  aa <- function(x, add) {
    # here we've replaced the direct calls to the plotting functions with
    # indirect calls with a given argument list
    if (!add) {
      do.call("plot", c(list(density(x)), gpar))
    } else {
      do.call("lines", c(list(density(x)), gpar))
    }
  }

  z <- list(...)
  loop <- seq_len(length(z))

  for (i in loop) {
    aa(z[[i]], add = i != 1)
  }
}

Эта измененная версияфункция должна обеспечивать то, что вы ищете:

set.seed(1)

y1 <- rnorm(200)
y2 <- rnorm(200)

bb(y1, y2, gpar = list(col = "red", lty = 2))

В качестве альтернативы, вы можете использовать эвристику для разделения аргументов, заданных в единственном ..., для отправки их в правильные функции.В этом случае одной из таких эвристик может быть указание именованных аргументов или нет:

bb2 <- function(...) {
  aa <- function(x, add, gpar) {
    # removed repetition by doing everything that
    # can be done outside of the conditional logic
    fun <- if (!add) "plot" else "lines"
    args <- c(list(density(x)), gpar)

    do.call(fun, args)
  }

  # capture all arguments
  dots <- list(...)

  # guarantee character vector of names
  nm <- names(dots)
  if (is.null(nm)) {
    nm <- rep("", length(dots))
  }

  # pick out named arguments
  gpar <- dots[nm != ""]

  # loop across unnamed args
  z <- dots[nm == ""]
  for (i in seq_along(z)) {
    aa(z[[i]], add = i != 1, gpar)
  }
}

bb2(y1, y2)

bb2(y1, y2, col = "blue", lty = 3)

Создано в 2018 г.-05-23 представьте пакет (v0.2.0).

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