在构建和加载R包时尝试在R源中调用内部数据对象会导致问题。我将lapply
与闭包一起使用是因为我想使用许多不同的内部数据对象生成相关函数。尝试在此包的R源代码中使用内部数据对象调用lapply
会导致错误,因为它在加载源时无法 找到内部数据,大概是因为它试图在加载R/
之前评估所有sysdata.rda
源文件。
I've made a minimal repo here reproducing the issue with toy data and a toy closure.
首先,我创建R/sysdata.rda
data-raw/create_x.R
x <- data.frame("a" = 1:5, "b" = 6:10)
devtools::use_data(x, internal = TRUE)
接下来,我定义闭包和lapply
调用
R/callx.R
#' Calls x
#' @export
getdata <- lapply(list(x = x), function(x) return(x))
使用devtools::load_all()
,一切都很好。我可以毫无问题地致电getdata$x
。但是,实际上尝试安装该软件包会导致:
> install()
Installing internaldata
'/Library/Frameworks/R.framework/Resources/bin/R' --no-site-file --no-environ --no-save --no-restore --quiet CMD \
INSTALL '/Users/admin/Development/internaldata' \
--library='/Library/Frameworks/R.framework/Versions/3.5/Resources/library' --install-tests
* installing *source* package ‘internaldata’ ...
** R
** byte-compile and prepare package for lazy loading
Error in lapply(list(x = x), function(x) return(x)) :
object 'x' not found
Error : unable to load R code in package ‘internaldata’
ERROR: lazy loading failed for package ‘internaldata’
* removing ‘/Library/Frameworks/R.framework/Versions/3.5/Resources/library/internaldata’
* restoring previous ‘/Library/Frameworks/R.framework/Versions/3.5/Resources/library/internaldata’
Error: Command failed (1)
在尝试加载R脚本之前,是否有任何聪明的方法来使R软件包安装/加载过程能够识别R/sysdata.rda
中的对象?