2012-09-11 23 views
4

我在写一个R包时定义了一个通用组函数时遇到了问题。在R包中定义组通用函数

这是一个相当小的例子:

setGroupGeneric('FooBarFunctions', function(x, y) NULL) 

setGeneric('foo', group = 'FooBarFunctions', function(x, y) standardGeneric('foo')) 
setGeneric('bar', group = 'FooBarFunctions', function(x, y) standardGeneric('bar')) 

setMethod('foo', signature(x = 'ANY', y = 'ANY'), 
function(x, y) 
    cat(sprintf('foo,ANY (%s),ANY (%s)\n', x, y))) 

setMethod('bar', signature(x = 'ANY', y = 'ANY'), 
function(x, y) 
    cat(sprintf('bar,ANY (%s),ANY (%s)\n', x, y))) 

setMethod('FooBarFunctions', signature(x = 'character', y = 'ANY'), 
function(x, y) 
    cat(sprintf('FooBarFunctions,character (%s),ANY (%s)\n', x, y))) 

如果我将此代码粘贴到R端子,然后一切按预期工作:

> foo(1, 2) 
foo,ANY (1),ANY (2) 
> bar(1, 2) 
bar,ANY (1),ANY (2) 
> foo('a', 2) 
FooBarFunctions,character (a),ANY (2) 
> bar('a', 2) 
FooBarFunctions,character (a),ANY (2) 

然而,当我尝试建立这变成了一个包,我遇到了以下错误:

$ R CMD INSTALL . 
* installing to library ‘~/R/x86_64-pc-linux-gnu-library/2.15’ 
* installing *source* package ‘anRpackage’ ... 
** R 
** preparing package for lazy loading 
** help 
No man pages found in package ‘anRpackage’ 
*** installing help indices 
** building package indices 
** testing if installed package can be loaded 
**Error in .setupMethodsTables(generic) : 
    trying to get slot "group" from an object of a basic class ("NULL") with no slots** 
Error: loading failed 
Execution halted 
ERROR: loading failed 
* removing ‘~/R/x86_64-pc-linux-gnu-library/2.15/anRpackage’ 

我使用packag的默认输出已增加e.skeleton():

exportPattern("^[[:alpha:]]+") 

进入空间文件

任何想法,我做错了吗?

+0

有没有其他人能重现此问题? – Ash

+0

没有人能够重塑这个? – Ash

回答

5

我可以得到这个工作,如果我加载运行的代码。这里的关键是evalqOnLoad呼叫

evalqOnLoad({ 

    setGroupGeneric('FooBarFunctions', function(x, y) NULL) 

    setGeneric('foo', group = 'FooBarFunctions', function(x, y) standardGeneric('foo')) 
    setGeneric('bar', group = 'FooBarFunctions', function(x, y) standardGeneric('bar')) 

    setMethod('foo', signature(x = 'ANY', y = 'ANY'), 
    function(x, y) 
     cat(sprintf('foo,ANY (%s),ANY (%s)\n', x, y))) 

    setMethod('bar', signature(x = 'ANY', y = 'ANY'), 
    function(x, y) 
     cat(sprintf('bar,ANY (%s),ANY (%s)\n', x, y))) 

    setMethod('FooBarFunctions', signature(x = 'character', y = 'ANY'), 
    function(x, y) 
     cat(sprintf('FooBarFunctions,character (%s),ANY (%s)\n', x, y))) 

}) 
包中的“喇嘛”

> require(bla) 
Le chargement a nécessité le package : bla 
> foo(1, 2) 
foo,ANY (1),ANY (2) 
> bar(1, 2) 
bar,ANY (1),ANY (2) 
> foo("a", 2) 
FooBarFunctions,character (a),ANY (2) 
> bar("a", 2) 
FooBarFunctions,character (a),ANY (2) 
+0

非常感谢答案 - 它确实允许包建立,但是我发现foo和bar函数不会再从包中导出...当您运行require(bla)时,那是在新的R会议? – Ash

+0

是的。肯定。 –

+0

嗯......奇怪。我运行'R CMD INSTALL bla',然后启动一个新的R并运行'require(bla)',我得到'错误:当我尝试运行'foo(1,2)'时找不到函数“foo”'。您的NAMESPACE文件中有什么?我有'exportPattern(“^ [[:alpha:]] +”)'。你使用什么版本的R?我在2.15.0。 – Ash