语言是R。
我有几份文件:
utilities.non.foo.R
utilities.foo.R
utilities.Rfoo是一个内部包,它被拼凑在一起(用于图像处理,尽管这是不相关的)。它工作得很好,但只在Linux机器上工作,即使在这些机器上也要尝试编译它是一件非常痛苦的事情。
基本上,utilities.foo.R包含了大量需要包foo的函数。这里的函数称为functionname.foo。
我即将开始与没有此包或Linux的外部协作者共享这段代码,因此我编写了一个文件utilities.non.foo.R,其中包含了utilities.foo.R中的所有函数,但对包foo的依赖已被删除。这些函数都被称为functionname.non.foo。
对于每个函数,文件utilities.R都有一个完整的堆:
functionname <- function(...) {
if ( fooIsLoaded() ) {
functionname.foo(...)
} else {
functionname.non.foo(...)
}
}这样做的想法是,您只需要加载utilities.R,如果您碰巧有包foo (例如,我的内部协作者),您将使用该后端。如果您没有foo (外部协作者),您将使用非foo后端。
我的问题是:是否有什么方法可以对每个函数名进行重定向,而不显式地为每个函数名编写上面的代码呢?
这让我想起了(例如)有一个print方法、一个print.table、print.data.frame等等,但是用户只需要使用print,就可以自动选择使用哪种方法。
我想要这个,除了method.class会更像method.depends_on_which_package_is_loaded。
有没有办法避免在我的utilities.R文件中编写每个函数的重定向函数?
发布于 2012-02-13 02:23:21
就像德克说的,用一个包裹就行了。在本例中,将所有新的*.non.foo函数放入一个新包中,该包也称为foo。将此foo分发给您的协作者,而不是内部版本。这样,您的实用程序代码就可以是
functionname <- function(...) functionname.foo(...)根本不用做任何检查。
发布于 2012-02-13 02:27:01
这里有一个想法:编写一个将f设置为f.foo或f.non.foo的函数。它可以在循环中调用,覆盖给定命名空间中的所有函数(或名称以.foo结尾的所有函数)。
dispatch <- function(s) {
if ( fooIsLoaded() ) {
f <- get( paste(s, "foo", sep=".") )
} else {
f <- get( paste(s, "non.foo", sep=".") )
}
assign( s, f, envir=.GlobalEnv ) # You may want to use a namespace
}
f.foo <- function() cat("foo\n")
f.non.foo <- function() cat("non-foo\n")
fooIsLoaded <- function() TRUE
dispatch("f")
f()
fooIsLoaded <- function() FALSE
dispatch("f")
f()一个更简单的解决方案是给这两个函数取相同的名称,但是将它们放在不同的名称空间/包中。
发布于 2012-02-13 02:58:31
这听起来很低效和不雅,但是
funify = function(f, g, package="ggplot2") {
if(paste("package:", package, sep="") %in% search()) f else
{ message("how do you intend to work without ", package) ; g}
}
detach(package:ggplot2)
foo = funify(paste, function(x) letters[x])
foo(1:10)
library(ggplot2)
foo = funify(paste, function(x) letters[x])
foo(1:10)https://stackoverflow.com/questions/9254709
复制相似问题