首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >功能自动重定向

功能自动重定向
EN

Stack Overflow用户
提问于 2012-02-13 01:59:50
回答 3查看 85关注 0票数 0

语言是R。

我有几份文件:

代码语言:javascript
复制
utilities.non.foo.R
utilities.foo.R
utilities.R

foo是一个内部包,它被拼凑在一起(用于图像处理,尽管这是不相关的)。它工作得很好,但只在Linux机器上工作,即使在这些机器上也要尝试编译它是一件非常痛苦的事情。

基本上,utilities.foo.R包含了大量需要包foo的函数。这里的函数称为functionname.foo

我即将开始与没有此包或Linux的外部协作者共享这段代码,因此我编写了一个文件utilities.non.foo.R,其中包含了utilities.foo.R中的所有函数,但对包foo的依赖已被删除。这些函数都被称为functionname.non.foo

对于每个函数,文件utilities.R都有一个完整的堆:

代码语言:javascript
复制
functionname <- function(...) {
    if ( fooIsLoaded() ) {
        functionname.foo(...)
    } else {
        functionname.non.foo(...)
    }
}

这样做的想法是,您只需要加载utilities.R,如果您碰巧有包foo (例如,我的内部协作者),您将使用该后端。如果您没有foo (外部协作者),您将使用非foo后端。

我的问题是:是否有什么方法可以对每个函数名进行重定向,而不显式地为每个函数名编写上面的代码呢?

这让我想起了(例如)有一个print方法、一个print.tableprint.data.frame等等,但是用户只需要使用print,就可以自动选择使用哪种方法。

我想要这个,除了method.class会更像method.depends_on_which_package_is_loaded

有没有办法避免在我的utilities.R文件中编写每个函数的重定向函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-13 02:23:21

就像德克说的,用一个包裹就行了。在本例中,将所有新的*.non.foo函数放入一个新包中,该包也称为foo。将此foo分发给您的协作者,而不是内部版本。这样,您的实用程序代码就可以是

代码语言:javascript
复制
functionname <- function(...) functionname.foo(...)

根本不用做任何检查。

票数 2
EN

Stack Overflow用户

发布于 2012-02-13 02:27:01

这里有一个想法:编写一个将f设置为f.foof.non.foo的函数。它可以在循环中调用,覆盖给定命名空间中的所有函数(或名称以.foo结尾的所有函数)。

代码语言:javascript
复制
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()

一个更简单的解决方案是给这两个函数取相同的名称,但是将它们放在不同的名称空间/包中。

票数 1
EN

Stack Overflow用户

发布于 2012-02-13 02:58:31

这听起来很低效和不雅,但是

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9254709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档