动态生成引用类(Dynamically Generate Reference Classes)

2019-08-31 22:54发布

我试图的R包在飞行中产生的参考类,它的证明是相当困难的。 下面是我碰到的,我采用的方法和问题:

我创建一个包中,我希望能够在一个模式中动态读取并自动生成相关的参考类(认为SOAP)。 当然,这意味着我将无法前手来定义包的来源我引用类。

我最初尝试使用简单的创建一个新的类:

myClass <- setRefClass("NewClassName", fields=list(fieldA="character"))

其中,当然,当交互执行,但包中包含的源时,我得到一个正常工作locked binding错误。 从我的阅读,它看起来像发生这种情况是因为交互方式运行时,该班级的信息被存储在全球环境中,这是不锁定,而我的包的基础环境已被锁定。

后来我发现使用的东西的效果提出了一个主题:

myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=globalenv())

这实际上坠毁R / Studio时,我试图建立的包,所以我没有记录它产生的,不幸的是错误的,但它肯定没有奏效。

接下来,我尝试创建我的包,我可以用它来存储这些引用类中的一个新的环境。 所以我增加了一个.classEnv <- new.env() :我的包中源(不是内部的任何功能的)线,然后尝试创建一个新的参考类时使用这个类

myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=.classEnv) 

这实际上似乎工作确定,但会生成以下警告:

> myClass <- setRefClass("NewClassName", where=.classEnv)
Warning message:
In getPackageName(where) :
  Created a package name, ‘2013-04-23 10:19:14’, when none found

因此,出于某种原因, methods::getPackageName()是不能够拿起我的新环境是哪个包?

有没有一种方法来创建不同的我的新的环境,让getPackageName()可以正确识别包? 我可以添加一些功能,让我帮getPackageName()检测的包? 这是否会甚至工作,如果我能处理的警告,还是我试图通过动态地创建他们滥用引用类?

Answer 1:

为了让谈话继续下去,我发现getpackageName存储在一个隐藏的包名.packageName在指定的环境变量。

所以,其实你可以得到与周围的警告

assign(".packageName", "MyPkg", envir=.classEnv)    
myClass <- setRefClass("NewClassName", fields=classFields, where=.classEnv)

它解决了警告,但该文件说,不信任.packageName无限可变的,我还是觉得我这个黑客并可能误解的东西有关引用类及其与环境的关系非常重要。

从文档的全部细节:

包名包的加载过程中正常安装,由INSTALL脚本或库函数。 (目前,该名被存储为对象.packageName,但没有为将来相信这个。)


编辑

阅读远一点之后, setPackageName方法可能设置的包名的环境中更可靠的方式。 每文档:

setPackageName可用于否则将不会有一个环境,建立一个包名。 这样就可以在任意环境中创建的类和/或方法,但通常优选通过标准的R编程工具(package.skeleton等)来创建包

因此,它看起来像一个有效的解决办法是以下几点:

setPackageName("MyPkg", .classEnv)
myClass <- setRefClass("NewClassName", fields=classFields, where=.classEnv)

这消除了警告消息,并且不依赖于任何真实记录为不稳定。 我仍然不清楚为什么这是必要的,但...



文章来源: Dynamically Generate Reference Classes