Могу ли я сохранить временное окружение функции в R?

#r #function

#r #функция

Вопрос:

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

Быстрая визуализация. Предположим

 fun <- function(x) {
  y <- x 1
  z <- y^2
  z*4
}

fun(2)
[1] 36
  

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

Заранее спасибо!

Комментарии:

1. Вот так? fun <- function(x) { y <- x 1 ; z <- y^2 ; return(list(y,z,z*4)) }

2. Для использования при отладке browser() эта функция помещает вас в интерактивный сеанс, где бы он ни вызывался. Вы можете исследовать и даже изменять переменные в области функций там.

3. Согласен с @snaut. Какие объекты вы хотите сохранить для исправления ошибок? Временная или постоянная? Какие значения этих объектов? Окончательный или промежуточный? Вам лучше запустить сеанс отладки. Современные R IDE, такие как RStudio, делают это очень простым.

4. Спасибо, я не знал об browser() опции. Возврат всех объектов в список займет довольно много времени, так как функция действительно большая. Собираюсь попробовать использовать browser() или назначить определенные объекты . GlobalEnv. Спасибо вам всем за помощь!

Ответ №1:

Вы могли бы вернуть объекты в списке или назначить переменные внутри функции с

 assign("x", x, envir = .GlobalEnv)
  

Комментарии:

1. Спасибо, это будет полезно!

Ответ №2:

Аналогично ответу от @user116, существует специальный оператор для достижения того, чего вы хотите.

Это ярлык для функции присваивания, использующий <<- оператор. Проверьте help("<<-") для получения дополнительной информации. Но в принципе, вы могли бы «сохранить» y и z в глобальной среде, выполнив это:

 # Make sure that these do not exist first.
stopifnot( all( !exists("y"), !exists("z")))

fun <- function(x) {
  y <<- x 1
  z <<- y^2
  z*4
}

fun(2)

# Verify y and z exist now.
stopifnot( all( exists("y"), exists("z")))
y
z
  

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