从不同来源调用两个同名的函数()

  • 本文关键字:两个 函数 调用 r
  • 更新时间 :
  • 英文 :


关于这篇文章:我如何从R中的两个源文件中调用两个同名的函数?

提供的示例显示了来自两个不同来源的同名函数:

在"aa.R">

hi <- function(){
print("hi, aa")
}

在"bb.R">

hi <- function(){
print("hi, bb")
}

现在我要做的是从aa中调用函数hi。R通过引用源。我知道在处理包时我可以使用:

packagename::functionname()

但是当使用source(filename.R)时,它不起作用。提供的答案之一解释了使用两个不同的环境,我不喜欢这样做,因为我觉得这样更容易出错。

也就是说,给两个函数命名相同的名字是不明智的。虽然我完全同意,使用不同的名称为函数实际做一些不同的事情会更有意义,但我仍然更喜欢通过引用源代码调用函数,出于可读性的目的,因为我可以立即看到我正在抓取函数的文件,而调试或编码一般。

还有一件事:是什么阻止我用我正在使用的函数创建一个包?是否有任何理由不从包含在我的主脚本中使用的函数的源文件创建一个包?谢谢你的建议。

除了(5)之外,这些都使用了最后注释中的示例。

1)独立环境source将每个文件放入单独的环境中,然后在调用函数时使用适当的环境来限定名称。这在精神上似乎非常接近library(aa); aa::aa.R

source("aa.R", local = aa <- new.env())
source("bb.R", local = bb <- new.env())
aa$hi()
## [1] "hi, aa"
bb$hi()
## [1] "hi, bb"

1)这种方法的一种变体是将其中一个hi放在单独的环境中。在那个不常用的情况下,那可能很有用。

source("aa.R", local = aa <- new.env())
source("bb.R")
aa$hi()
## [1] "hi, aa"
hi()
## [1] "hi, bb"

1 b)另一种方法是将它们附加到搜索列表中。

source("aa.R", local = attach(NULL, name = "aa"))
source("bb.R", local = attach(NULL, name = "bb"))
as.environment("aa")$hi()
## [1] "hi, aa"
as.environment("bb")$hi()
## [1] "hi, bb"
<<p>2)框/strong>康拉德·鲁道夫的盒子包装(在CRAN上)可以用于此。同样,这与library(aa); aa::aa.R没有太大的不同。
box::use(./aa)
box::use(./bb)
aa$hi()
## [1] "hi, aa"
bb$hi()
## [1] "hi, bb"

3)独特另一种方法是每次调用hi时重新读取文件。

source("aa.R")
hi()
## [1] "hi, aa"
source("bb.R")
hi()
## [1] "hi, bb"
source("aa.R")
hi()
## [1] "hi, aa"

4)重命名还有一种方法是每次读取它时都重命名它。如果hi本身在源文件中使用,这将不起作用,但在其他情况下是可以的。(这也可以与上述解决方案之一结合使用。)

source("aa.R")
aa_hi <- hi
rm(hi)
source("bb.R")
bb_hi <- hi
rm(hi)
aa_hi()
## [1] "hi, aa"
bb_hi()
## [1] "hi, bb"

5) S3如果hi的两个实例在不同的输入类上工作,则可以将它们设置为相同泛型的方法。将示例更改为:

cat('hi <- function(x, ...) UseMethod("hi")
hi.numeric <- function(x) {
print(paste("hi, aa -", x))
}', file = "aa.R")
cat('hi <- function(x, ...) UseMethod("hi")
hi.character <- function(x) {
print(paste("hi, bb -", x))
}', file = "bb.R")
source("aa.R")
source("bb.R")
hi(1)
## [1] "hi, aa - 1"
hi("z")
## [1] "hi, bb - z"
<<p>6)模块/strong>模块包(在CRAN上)可以使用。
library(modules)
aa <- use("aa.R")
bb <- use("bb.R")
aa$hi()
## [1] "hi, aa"
bb$hi()
## [1] "hi, bb"
<<p>7)包/strong>另一种可能性是将脚本转换为包。运行以下命令转换aa。R到一个包,构建,安装并运行它。bb也是一样。R .
library(pkgKitten)
library(devtools)
setwd("...directory containing aa.R...")
kitten("aa", author = "me") # create empty package
file.copy("aa.R", "aa/R") # add script to it
setwd("aa")
build()
install()
setwd("..")
aa::hi()
## [1] "hi, aa"

注意

以可复制的形式生成输入

cat('hi <- function() {
print("hi, aa")
}', file = "aa.R")
cat('hi <- function() {
print("hi, bb")
}', file = "bb.R")

这是一种基于环境的方法:

my_Fun <- function(path_To_File)
{
source(path_To_File)
new_Env <- new.env()
new_Env$hi <- hi
return(new_Env)
}
env1 <- my_Fun("aa.R")
env2 <- my_Fun("bb.R")
> evalq(hi(), env1)
[1] "hi, aa"
> evalq(hi(), env2)
[1] "hi, bb"

最新更新