Передать необязательные аргументы функции, три точки - PullRequest
0 голосов
/ 24 мая 2018

Я запутался, как работает ....

tt = function(...) {
  return(x)
}

Почему tt(x = 2) не возвращает 2?

Вместо этого происходит сбой с ошибкой:

Ошибка в tt (x = 2): объект 'x' не найден

Даже если я передаю x в качестве аргумента?

Ответы [ 3 ]

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

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

tt <- function(x, ...){
       mean(x, ...)
}

x <- c(1, 2, 3, NA)
tt(x)
#[1] NA
tt(x, na.rm = TRUE)
#[1] 2

здесь ... ссылается на любые другие аргументы, которые функция mean может принять .Кроме того, у вас есть обычный аргумент x.в первом примере tt(x) просто возвращает mean(x), тогда как во втором примере tt(x, na.rm = TRUE) передает второй аргумент na.rm = TRUE в mean, поэтому tt возвращает mean(x, na.rm = TRUE).

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

Другой способ, которым программисты R часто используют, - это list(...), как в

tt <- function(...) {
    args <- list(...)    # As in this
    if("x" %in% names(args))
        return(args$x)
    else
        return("Something else.")
}

tt(x = 2)
#[1] 2

tt(y = 1, 2)
#[1] "Something else."

. Я считаю, что это один из их любимых, если не , любимых способов.обработки аргументов точек.

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

Потому что все, что вы передаете в ..., остается в ....Переменные, которые вы передаете и которые явно не фиксируются параметром, не расширяются в локальную среду.... следует использовать для значений, с которыми вашей текущей функции вообще не нужно взаимодействовать, но некоторые более поздние функции нужно использовать, чтобы их можно было легко передавать внутри ....Он предназначен для сценария, подобного

ss <- function(x) {
   x
}

tt <- function(...) {
  return(ss(...))
}

tt(x=2)

Если вашей функции требуется определить переменную x, это должен быть параметр

tt <- function(x, ...) {
  return(x)
}

Если вы действительно хотите расширить точкив текущую среду (и я настоятельно рекомендую, чтобы вы этого не сделали), вы можете сделать что-то вроде

tt <- function(...) {
  list2env(list(...), environment())
  return(x)
}
...