Я не понимаю, как работает ....
tt = function(...) {
return(x)
}
Почему tt(x = 2) не возвращает 2?
Вместо этого происходит сбой с ошибкой:
Error in tt(x = 2) : object 'x' not found
Даже если я передаю x в качестве аргумента?
tt = function(x,levels) { if (missing(levels)) return(x) } tt(x = 2)Связанное сообщение: stackoverflow.com/questions/5890576/…





Потому что все, что вы передаете в ..., остается в .... Передаваемые вами переменные, которые явно не захватываются параметром, не расширяются в локальную среду. ... следует использовать для значений, с которыми ваша текущая функция вообще не должна взаимодействовать, но некоторые более поздние функции действительно должны использовать, чтобы их можно было легко передать внутри .... Это предназначено для такого сценария, как
ss <- function(x) {
x
}
tt <- function(...) {
return(ss(...))
}
tt(x=2)
Если вашей функции необходимо определить переменную x, она должна быть параметром
tt <- function(x, ...) {
return(x)
}
Если вы действительно хотите расширить точки в текущей среде (и я настоятельно рекомендую этого не делать), вы можете сделать что-то вроде
tt <- function(...) {
list2env(list(...), environment())
return(x)
}
если вы определяете три точки в качестве аргумента для своей функции и хотите, чтобы она работала, вам нужно указать своей функции, куда на самом деле идут точки. в вашем примере вы не определяете ни 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).
Еще один способ, который часто используют программисты 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."
Я считаю, что это один из их любимых, если не любимый в способ обработки аргументов точек.
вы не передаете
xв качестве аргумента.