在R包中定义组泛型函数
在我正在编写的R包中定义组泛型时遇到问题 以下是一个相当简单的示例:在R包中定义组泛型函数,r,s4,R,S4,在我正在编写的R包中定义组泛型时遇到问题 以下是一个相当简单的示例: setGroupGeneric('FooBarFunctions', function(x, y) NULL) setGeneric('foo', group = 'FooBarFunctions', function(x, y) standardGeneric('foo')) setGeneric('bar', group = 'FooBarFunctions', function(x, y) standardGeneri
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’
我正在使用package.skeleton()的默认输出,添加了:
exportPattern("^[[:alpha:]]+")
进入命名空间文件
知道我做错了什么吗?如果我在加载时运行代码,我可以让它工作。这里的关键是
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)))
})
在“bla”包中:
> 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)
有没有其他人能够重现这个问题?没有人能够重现这个问题?非常感谢你的回答-它当然允许包生成,但我发现foo和bar函数不再从包中导出。。。当您运行
require(bla)
时,这是在新的R会话中吗?嗯。。。古怪的我运行R CMD INSTALL bla
,然后启动一个新的R并运行require(bla)
,我得到错误:当我尝试运行foo(1,2)
时找不到函数“foo”
。您的名称空间文件中有什么?我有exportPattern(“^[:alpha:][]+”)
。您使用的是什么版本的R?我使用的是2.15.0。这很有趣-您最初的解决方案似乎在R2.15.2(在Windows上)上适用于我,但在2.15.0(在Linux上)中不需要为我导出函数。。。可能在版本2.15.0和2.15.2之间的名称空间行为发生了变化?这是OSX Lion上的R2.15.1,具有与您相同的名称空间。是的,这适用于R2.15.1或更高版本。这似乎有点“变通”——我不认为核心R包是这样写的?