【问题标题】:Can I save the temporary environment of a function in R?我可以在 R 中保存函数的临时环境吗?
【发布时间】:2016-10-19 10:15:11
【问题描述】:

我目前正在为特定情节编写一个相当大的函数。出于修复错误的原因,我想保留该函数创建的所有对象,但到目前为止我的网络搜索不成功。

快速可视化。假设

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

fun(2)
[1] 36

对于这个简单的案例,我想将 y 和 z 保持在可访问的环境中,以便能够理解我的函数的某些阶段产生的结果。

提前致谢!

【问题讨论】:

  • 喜欢这个? fun &lt;- function(x) { y &lt;- x+1 ; z &lt;- y^2 ; return(list(y,z,z*4)) }
  • 为了调试使用browser() 这个函数让你进入一个交互会话,无论它被调用。您可以在那里探索甚至更改函数范围内的变量。
  • 同意@snaut。出于修复错误的原因,您要保存哪些对象?暂时的还是持久的?这些对象的哪些值?最终还是中间?你最好启动一个调试会话。像 RStudio 这样的现代 R IDE 让这变得非常简单。
  • 谢谢,我不知道browser() 选项。返回列表中的所有对象将非常耗时,因为该函数非常大。将尝试使用browser() 或将某些对象分配给.GlobalEnv。谢谢大家的帮助!

标签: r function


【解决方案1】:

您可以返回列表中的对象或使用

分配函数内的变量
assign("x", x, envir = .GlobalEnv)

【讨论】:

  • 谢谢,这会很有帮助!
【解决方案2】:

与@user116 的答案类似,有一个特殊的运算符可以实现您想要的。

这是赋值函数的快捷方式使用&lt;&lt;- 运算符。查看help("&lt;&lt;-") 了解更多信息。但基本上,您可以通过这样做在全局环境中“保存”yz

# 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

有很多关于环境的知识,可能对编写长函数等有帮助,所以这只是冰山一角。

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多