访问在函数中创建的R对象

访问在函数中创建的R对象,r,devtools,cran,R,Devtools,Cran,我正在尝试安装CRAN,它允许用户通过在搜索路径上创建一个类似的静态对象来操纵反应性闪亮对象。我知道我无法向全局环境写入它当前所做的事情,但我不确定在函数执行后如何让对象持久化 存储它一种方法: 存储它一种方法: store_it1 CRAN将允许您在tempdir中存储和读回项目,如下所示,或者您可以省略tmpdir,只使用当前目录,就像R的Rprof一样 2如果包定义了保存对象的环境,也可以将对象存储在包本身中。因此,这是可行的 store <- new.env() store_it

我正在尝试安装CRAN,它允许用户通过在搜索路径上创建一个类似的静态对象来操纵反应性闪亮对象。我知道我无法向全局环境写入它当前所做的事情,但我不确定在函数执行后如何让对象持久化

存储它一种方法:

存储它一种方法:

store_it1 CRAN将允许您在tempdir中存储和读回项目,如下所示,或者您可以省略tmpdir,只使用当前目录,就像R的Rprof一样

2如果包定义了保存对象的环境,也可以将对象存储在包本身中。因此,这是可行的

store <- new.env()

store_it2 <- function() {
    store$iris_df <- head(iris)
    store$rand <- runif(3)
    invisible(store)
}

retrieve_it2 <- function(envir = parent.frame()) {
    list2env(as.list(store), envir)
}
检索_it2的另一种方法是只导出包中的存储,然后用户可以访问其内容,例如,存储$x或使用存储,使用x访问x或使用attachstore附加它。当然,如果导出store,则可以同时提供这两个选项-用户可以直接访问store,也可以运行retrieve_it2。

1 CRAN将允许您在tempdir中存储和读取项目,如下所示,或者可以省略tmpdir,只需像R的Rprof一样使用当前目录

2如果包定义了保存对象的环境,也可以将对象存储在包本身中。因此,这是可行的

store <- new.env()

store_it2 <- function() {
    store$iris_df <- head(iris)
    store$rand <- runif(3)
    invisible(store)
}

retrieve_it2 <- function(envir = parent.frame()) {
    list2env(as.list(store), envir)
}

检索_it2的另一种方法是只导出包中的存储,然后用户可以访问其内容,例如,存储$x或使用存储,使用x访问x或使用attachstore附加它。当然,如果导出了store,则可以同时提供这两个选项-用户可以直接访问store,也可以运行retrieve_it2。

感谢您的建议。如果我理解正确,它将写入全局环境,并有可能覆盖现有对象。根据我从CRAN版主那里得到的反馈,我认为这是不允许的。retrieve\它将存储加载到envir参数指定的环境中,默认情况下,该参数是调用它的环境,但您可以指定任何您喜欢的环境。它的功能非常好。试着把它放在一个小的包中,运行R CMD check-as cran,你会发现它不会抱怨。我们还添加了第二种方法。这两种方法都应该有效。我感谢你的帮助。理想情况下,这一切都发生在一个函数中。我在这里放了一个更好的reprex。你能确认我用的是否正确吗?我在函数中有一个默认为.GlobalEnv的envir参数,但当CRAN查看它时,它没有通过。据我所知,R CMD Check不够敏感,无法捕捉到问题,因为它专门针对assign…,.GlobalEnv。您能否进一步解释一下为什么parent.frame优于.GlobalEnv?最终结果似乎是一样的。再次感谢。我不是在运行RStudio,只是在看它。它看起来不错。envir=parent.frame是许多R函数使用的惯用用法,看起来很灵活。用户可能不希望首先破坏他们的全局环境,这允许他们这样做或不这样做。我在答案的末尾添加了更多的讨论。谢谢你的建议。如果我理解正确,它将写入全局环境,并有可能覆盖现有对象。根据我从CRAN版主那里得到的反馈,我认为这是不允许的。retrieve\它将存储加载到envir参数指定的环境中,默认情况下,该参数是调用它的环境,但您可以指定任何您喜欢的环境。它的功能非常好。试着把它放在一个小的包中,运行R CMD check-as cran,你会发现它不会抱怨。我们还添加了第二种方法。这两种方法都应该有效。我感谢你的帮助。理想情况下,这一切都发生在一个函数中。我在这里放了一个更好的reprex。你能确认我用的是否正确吗?我在函数中有一个默认为.GlobalEnv的envir参数,但当CRAN查看它时,它没有通过。据我所知,R CMD Check不够敏感,无法捕捉到问题,因为它专门针对assign…,.GlobalEnv。您能否进一步解释一下为什么parent.frame优于.GlobalEnv?最终结果似乎是一样的。再次感谢。我不是在运行RStudio,只是在看它。它看起来不错。envir=parent.frame是许多R函数使用的惯用用法,看起来很灵活。用户可能不希望首先破坏他们的全局环境,这允许他们这样做或不这样做。我在答案的末尾又加了一些讨论。