Есть ли способ вернуть все объекты, определенные в функции в R? - PullRequest
2 голосов
/ 03 марта 2020

Есть ли способ вернуть все объекты, определенные в функции в R?

Вот небольшой пример того, что я пытаюсь сделать. Я хочу вернуть все, что я назначил значение внутри этой функции (dave, mark, xx, z (если существует)). Оператор печати излишен.

Обычно я бы даже не пытался это сделать, просто я конвертирую файл source d в функцию, а ранее все объекты были получены из глобальной среды, это то, что мне все еще нужно, и я бы не стал создавать огромный список всех объектов в конце функции. В идеале после запуска функции все объекты находятся в глобальной среде и могут быть доступны из списка. (Автоматически исключать из списка и оставлять их как отдельные объекты было бы замечательно.) Возможно, это должен быть класс?

Выдает ошибку, если какой-либо из них NULL, если, например, y предоставляется как NULL в аргументах определения функции (т.е. test_func <- function(x = c(1, 2), y = NULL) ...).

test_func <- function(x = c(1, 2), y = 3) {
  xx <- x * x
  if(!is.null(y)) z <- x * y
  mark <- "hello"
  dave <- data.frame(x = x, xx = xx)
  whatshere <- ls()
  print(whatshere)
  whatsout <- list()
  for (i in 1:length(whatshere)) {
    whatsout[[i]] <- get(whatshere[[i]])
  }
  names(whatsout) <- whatshere
  return(whatsout)
}
test_func()
#> [1] "dave" "mark" "x"    "xx"   "y"    "z"
#> $dave
#>   x xx
#> 1 1  1
#> 2 2  4
#> 
#> $mark
#> [1] "hello"
#> 
#> $x
#> [1] 1 2
#> 
#> $xx
#> [1] 1 4
#> 
#> $y
#> [1] 3
#> 
#> $z
#> [1] 3 6

Создано в 2020-03-03 пакетом Представлять (v0.3.0)

1 Ответ

4 голосов
/ 03 марта 2020

Есть ли способ вернуть все объекты, определенные в функции в R?

Буквально, есть 1 :

as.list(environment())

Тем не менее, я бы обычно рекомендовал против this: быть явным , назвать все объекты, которые вы хотите вернуть индивидуально:

list(
    foo = foo,
    bar = bar,
    …
)

1 Это будет включать аргументы, так как это просто локально определенные значения. Чтобы исключить формальные аргументы, сделайте это:

values = as.list(environment())
values[setdiff(names(values), names(formals()))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...