如何在包 dev 中打开的项目上自动加载和附加导入的函数?
How can I automatically load and attach imported functions on project open in package dev?
当我在计算机上打开 R package 项目时,我想自动加载并附加 library()
中列出的所有包给定包的相应 NAMESPACE
作为 import()
s(不是 importFrom()
s)。
这很有用,因为它使我能够更快地以交互方式评估代码。否则,我会浪费时间处理,比如说,
glue("foo")
# Error in glue("foo") : could not find function "glue"
尽管我在我的NAMESPACE
里有胶水。
没什么大不了的,稍微减少了几秒钟,也有点沮丧。
请注意,这仅适用于 package 开发环境。
在非包项目中,我可以将 library()
放入我的 .Rprofile
,但对于包来说,这将是多余的,其中所述包 是 已经声明在 NAMESPACE
.
我的方法是将以下内容添加到我的项目(和包)根目录中的 .Rprofile
:
if (Sys.getenv()["LOGNAME"] %in% c("foo_user", "bar_user")) {
message("I seem to be running on a dev machine, so I am doing some preparatory steps.")
imports <- devtools::parse_ns_file()$imports # capture all imports from namespace file
imports <- purrr::discard(.x = imports, .p = is.list) # only take the import(), not the importFrom() declarations.
purrr::walk(.x = imports, .f = library, character.only = TRUE)
}
这看起来是个不错的方法吗?
更新(上面已经包含)
似乎有些 CI 系统 (Appveyor) 不喜欢 devtools::...
) 和 .Rprofile
中的其他调用,可能是因为他们没有这个和其他可用的包在构建周期的任何阶段 .Rprofile
被调用(很早?)。
因此,将整个 shebang 包装在 if 子句中以仅在本地开发机器上调用它似乎是明智的。
在 macOS 上,Sys.getenv()["LOGNAME"]
给出了短用户名,所以我用它来识别我的开发机器。
如果有人有更好的想法,请告诉我。
当我在计算机上打开 R package 项目时,我想自动加载并附加 library()
中列出的所有包给定包的相应 NAMESPACE
作为 import()
s(不是 importFrom()
s)。
这很有用,因为它使我能够更快地以交互方式评估代码。否则,我会浪费时间处理,比如说,
glue("foo")
# Error in glue("foo") : could not find function "glue"
尽管我在我的NAMESPACE
里有胶水。
没什么大不了的,稍微减少了几秒钟,也有点沮丧。
请注意,这仅适用于 package 开发环境。
在非包项目中,我可以将 library()
放入我的 .Rprofile
,但对于包来说,这将是多余的,其中所述包 是 已经声明在 NAMESPACE
.
我的方法是将以下内容添加到我的项目(和包)根目录中的 .Rprofile
:
if (Sys.getenv()["LOGNAME"] %in% c("foo_user", "bar_user")) {
message("I seem to be running on a dev machine, so I am doing some preparatory steps.")
imports <- devtools::parse_ns_file()$imports # capture all imports from namespace file
imports <- purrr::discard(.x = imports, .p = is.list) # only take the import(), not the importFrom() declarations.
purrr::walk(.x = imports, .f = library, character.only = TRUE)
}
这看起来是个不错的方法吗?
更新(上面已经包含)
似乎有些 CI 系统 (Appveyor) 不喜欢 devtools::...
) 和 .Rprofile
中的其他调用,可能是因为他们没有这个和其他可用的包在构建周期的任何阶段 .Rprofile
被调用(很早?)。
因此,将整个 shebang 包装在 if 子句中以仅在本地开发机器上调用它似乎是明智的。
在 macOS 上,Sys.getenv()["LOGNAME"]
给出了短用户名,所以我用它来识别我的开发机器。
如果有人有更好的想法,请告诉我。