【发布时间】: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