【问题标题】:How to easily access hidden environment in package2 from package1?如何从 package1 轻松访问 package2 中的隐藏环境?
【发布时间】:2019-09-11 22:13:47
【问题描述】:

我正在尝试使用我自己的包中 function1 中的 localgeo 包在 R 中生成纬度和经度,但是,如果不显式加载包,我无法弄清楚如何做到这一点。

如何启用 package1 中的功能轻松访问 package2 的隐藏环境及其对象?

### fails
data <- data.frame(City = c("New York", "Miami", "Los Angeles"), 
State = c("NY", "FL", "CA")
data <- cbind(data, localgeo::geocode(data[["City"]], data[["State"]]))
Error in UseMethod("tbl_vars") : 
  no applicable method for 'tbl_vars' applied to an object of class "NULL"
### works
library(localgeo)

data <- data.frame(City = c("New York", "Miami", "Los Angeles"), 
State = c("NY", "FL", "CA")
data <- cbind(data, geocode(data[["City"]], data[["State"]]))

我认为问题是函数 localgeo::geocode() 看起来像

function (city, state) 
{
    data.frame(city = as.character(city), state = as.character(state), 
        stringsAsFactors = FALSE) %>% left_join(.localgeo$geo_db, 
        by = c("city", "state")) %>% select(lon, lat)
}
<environment: namespace:localgeo>

我不知道如何使.localgeo 可用于我的函数。


更新:似乎在我的包的DESCRIPTION 文件中使用Depends: localgeo 不仅“加载”而且“附加”localgeo,因此我可以毫无问题地运行localgeo::geocode()。当然,

除非有充分的理由,否则您应该始终在 Imports not Depends 中列出包。这是因为一个好的包是自包含的,并且最小化了对全局环境(包括搜索路径)的更改。唯一的例外是如果您的包被设计为与另一个包一起使用。例如,模拟包建立在 vegan 之上。没有 vegan 就没有用,所以它在 Depends 而不是 Imports 中有 vegan。同样, ggplot2 应该真正依赖于比例,而不是导入它。 Namespace

是否可以在不“附加”package2 的情况下访问我的package1 中的package2 中的隐藏环境?


对于那些寻求 MWE 的人来说,挑战:solve this MWE

【问题讨论】:

  • package readme“这是一个小得离谱的包,实际上只是数据目录中cities.rda 文件上的一个函数接口。所以,如果你想抓住它把你自己的工作包起来。” 所以,也许只是抓住那个.rda 文件并将它作为你包数据的一部分包含进来。似乎您遇到的问题是localgeo 导入dplyr,而您没有。您可以使用dplyr 或将merge 用于您自己版本的geocode 函数。
  • 谢谢,@Gregor,我确信通过将cities.rda 放入我的data/ 并将geocode() 重写为我自己的包中的一个函数,这可以工作——所以现实生活中的用例可解决的。但是,我仍然不知道如何从我的 package1 中的 package2 轻松访问隐藏环境及其对象。另外,我的包已经包含Import: dplyr。谢谢!

标签: r hidden-files


【解决方案1】:

如果您正在创建一个从其他包调用函数的包,您需要一些东西。

  1. 您的包目录应该有一个名为“R”的子目录。您的函数位于该“R”子目录中的文件中。
  2. 您的代码应该进行合格的函数调用。您的失败代码实际上是正确的:localgeo::geocode()。
  3. 我猜您的包目录中的说明文件中缺少一部分。您可以在此处使用 Imports: 节点指定必须与您的包一起加载的包依赖项。我开发的一个包依赖于其他几个包。您的代码没有显式调用 library() 函数。您只需在说明文件中说明您需要什么。当您加载或构建自己的包时,DESCRIPTION 文件也将包含其他包,并且您的合格函数调用将起作用。

这里以我的DESCRIPTION文件中的节点为例。

Imports: 
    stats,
    utils,
    ggplot2,
    plyr

【讨论】:

  • 为混淆道歉,@jai-jeffryes!当我重新启动 R 和计算机时,步骤 1-3 加上 devtools::load_all(".") 是不够的。仍然需要一些额外的东西(或不同于Imports: localgeo)。谢谢!
  • 现在我真的很好奇。该线程上是否有足够的内容来重现该问题?我开始想在我的电脑上看到这个问题。答案就在某个地方。
  • 如果包构建是可重现的,那就太酷了。你有这个包上传到 GitHub 上吗?我很想克隆它并查看问题。我希望 Imports: localgeo 能够工作(也假设安装了 localgeo!)。我以前没有遇到过 .onAttach 等问题,我认为在我的环境中证明这一点会很有趣。
  • 挑战:solve this MWE
  • @nko_jd。我看到你的帖子了。没有 ETA 适合您,但我希望能够克隆您的 MWE 存储库并尝试重现您的问题。完成后我会回到这个线程。
【解决方案2】:

问题是localgeo 有问题。它在附加时会加载一些数据,但是以您的方式使用它,包永远不会被附加,因此数据永远不会被加载。这就是为什么当您调用 library(localgeo): 时该错误消失的原因。

修复非常简单。 https://github.com/hrbrmstr/localgeo/blob/master/R/zzz.R中的函数.onAttach应该重命名为.onLoad

我建议遵循@Gregor 的建议,不要打扰localgeo,但您也可以通过https://github.com/hrbrmstr/localgeo/issueslocalgeo 作者提交问题,甚至可以通过“拉取请求”在https://github.com/hrbrmstr/localgeo/pulls.

【讨论】:

  • 您是说“在编写 package1 时,没有简单的方法可以访问诸如 .localgeo 之类的隐藏环境及其在 package2 中的 .localgeo$geo_db 之类的对象,除非 package2 使用了 .onAttach() 或 package1 使用了 @987654333 @"?
  • 不,一点也不。我是说这个包有问题,而且环境从来没有被创造出来。如果它已被创建,那么您所做的将会奏效。您可以通过调用localgeo:::.onAttach("foo", "bar") 来解决该错误,但我仍然建议您遵循@Gregor 的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多