我是在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 "<-"
可能是错误是因为使用了新环境。请帮忙解决这个问题。
答案 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"