如何在R中同时调用同一包不同版本的指定函数?
在R中调用同一包不同版本的单个函数(无需加载整个包)
R完全支持这种需求——不用加载整个包,就能提取指定版本包中的单个函数并分别赋值使用,下面是两种靠谱的实现方法:
方法一:用getFromNamespace精准提取(推荐)
这个函数可以直接从指定路径下的包命名空间中取出目标函数,不会加载整个包到当前环境,还能自动处理函数的内部依赖,是最稳妥的方式:
# 提取v1版本的foo::bar bar_v1 <- getFromNamespace("bar", ns = "foo", lib.loc = "pkgs/v1") # 提取v2版本的foo::bar bar_v2 <- getFromNamespace("bar", ns = "foo", lib.loc = "pkgs/v2")
之后直接调用bar_v1()和bar_v2()就能分别使用两个版本的函数了。
方法二:直接加载函数源码文件
如果函数不依赖包内其他组件,可以直接从包的安装路径加载对应的源码文件:
# 加载v1版本的bar函数源码 sys.source("pkgs/v1/foo/R/bar.R", envir = environment()) bar_v1 <- bar rm(bar) # 清理临时变量 # 加载v2版本的bar函数源码 sys.source("pkgs/v2/foo/R/bar.R", envir = environment()) bar_v2 <- bar rm(bar)
注意:如果bar函数依赖包内其他未加载的函数,这种方法会报错,此时优先用方法一。
关于你之前的尝试
修改.libPaths()只能改变R搜索包的顺序,foo::bar还是会调用第一个找到的版本,没法同时指定多个版本,所以不如getFromNamespace直接精准定位来得高效。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

