Принесите объекты, созданные функцией R, в основную рабочую среду - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь проверить внутренние объекты, созданные функцией R, как показано в примере ниже:

myfunction <- function(arg1, arg2){
sum.both <- arg1+arg2
diff.both <- arg1-arg2
return(diff.both)
}

Я знаю, что могу перенести его в рабочую среду, изменив саму функцию:

myfunction.mod <- function(arg1, arg2){
sum.both <- arg1+arg2
sum.both <<- sum.both
diff.both <- arg1-arg2
return(diff.both)
}

myfunction.mod(1,2)

Сделав это, я могу увидеть объект sum.both, набрав ls() в консоли. Тем не менее, я ищу способ получить такие внутренние объекты из любой существующей функции. Поэтому я безуспешно пытался debug() и environment(). Будем благодарны за любые идеи или указания о том, как получить внутренние объекты из функции.

1 Ответ

2 голосов
/ 15 апреля 2020

Полагаю, один простой способ изменить существующую функцию - использовать инструмент отладки trace(). Мы можем использовать это для вставки кода, который будет запускаться при выходе из функции, чтобы «утечь» все значения из области действия функции в глобальную область. Вот такая функция

make_leaky <- function(f) {
  fn <- substitute(f)
  invisible(trace(fn, print=FALSE, exit=quote(list2env(mget(ls()), globalenv()))))
}

Затем мы можем проверить ее с помощью следующей функции

foo <- function(x, y) {
  a <- x+7
  b <- x*y
  b/a
}

Мы будем использовать ls(), чтобы увидеть все переменные на каждом шаге

ls()
# [1] "foo"        "make_leaky"
foo(5,2)
# [1] 0.8333333
ls()    # NO NEW VARIABLES CREATED HERE
# [1] "foo"        "make_leaky"   
make_leaky(foo) 
foo(5,2)
# [1] 0.8333333
ls()   # ALL VARIABLES FROM FOO ARE NOW IN GLOBAL ENV
# [1] "a"          "b"          "foo"        "make_leaky"
# [5] "x"          "y" 
...