在新环境中加载和保存脚本

时间:2015-11-28 07:19:15

标签: r package

我是在R中打包开发的新手。我了解到脚本和包中的代码之间存在差异。当我们使用source()加载脚本时,每行代码都会被执行。但是如果在构建包时代码被执行并且结果被保存。下次使用library()require()加载包时,我们可以使用缓存的结果。

我创建了一个脚本time.R。脚本包含一条指令,如下所示:

> ctime <- Sys.time()

我的目标是在新环境中加载和保存脚本。稍后加载它以验证ctime中存储的时间不是当前时间,而是实际加载时间。

> env <- new.env(parent = emptyenv())
> source('ctime.R',local = env)
  Error in eval(expr, envir, enclos) : could not find function "<-"

可能是错误是因为使用了新环境。请帮忙解决这个问题。

2 个答案:

答案 0 :(得分:2)

首先,我建议您阅读this beautiful article以更好地了解R中environment的内容以及R如何查找函数和对象。

您案件中的问题来自于您创建了env成为&#34;孩子&#34; emptyenv的{​​{1}},即环境的根源&#39;树。在这样的环境中评估表达式时,R只能搜索其中或其父级(空白)中的函数。因此,实际上找不到任何功能。你可以尝试:

env <- new.env()
source("time.R",local=env)

一切正常。在上面的例子中,新环境是调用创建的环境的子代。

答案 1 :(得分:0)

如果您想支持源R文件中的基本R函数,同时最大限度地减少因环境引起的副作用&#34;链接&#34;您可以将基础环境用作环境的父级:

# The "package:base" is R's base package and always required
# > search()
# [1] ".GlobalEnv"        "tools:rstudio"     "package:stats"     "package:graphics"  "package:grDevices" "package:utils"     "package:datasets" 
# [8] "package:methods"   "Autoloads"         "package:base"   

env <- new.env(baseenv())
source('ctime.R',local = env)

# Now it works without an error:
env$ctime
# [1] "2017-11-03 19:48:20 CET"
相关问题