我试图在R包中动态生成引用类,并且它被证明是相当困难的.以下是我采取的方法和遇到的问题:
我正在创建一个包,我希望能够在模式中动态读取并自动生成关联的引用类(想想SOAP).当然,这意味着我无法在包源中预先定义我的引用类.
我最初尝试使用简单的方法创建一个新类:
myClass <- setRefClass("NewClassName", fields=list(fieldA="character"))
Run Code Online (Sandbox Code Playgroud)
当然,它在交互式执行时工作正常,但是当包含在包源中时,我会收到locked binding错误.从我的阅读中看,这看起来是因为当交互式运行时,类信息存储在未锁定的全局环境中,而我的包的基本环境被锁定.
然后我发现了一个建议使用某些东西的线程:
myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=globalenv())
Run Code Online (Sandbox Code Playgroud)
当我尝试构建软件包时,这实际上已经崩溃了R/Studio,所以我不知道它生成的错误的日志,但不幸的是,它当然没有用.
接下来我尝试在我的包中创建一个新环境,我可以使用它来存储这些引用类.所以我.classEnv <- new.env()在我的包源中添加了一行(不在任何函数内部),然后在创建新的引用类时尝试使用该类:
myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=.classEnv)
Run Code Online (Sandbox Code Playgroud)
这实际上似乎工作正常,但会产生以下警告:
> myClass <- setRefClass("NewClassName", where=.classEnv)
Warning message:
In getPackageName(where) :
Created a package name, ‘2013-04-23 10:19:14’, when none found
Run Code Online (Sandbox Code Playgroud)
所以,出于某种原因,methods::getPackageName()我无法拿起我的新环境所在的软件包?
有没有办法以不同的方式创建我的新环境,以便getPackageName()能够正确识别包?我可以添加一些允许我帮助getPackageName()检测包的功能吗?如果我可以处理警告,或者我是否通过尝试动态创建它们而滥用引用类,这是否会起作用?