我在R工作,我想定义一些我(或我的一个合作者)无法改变的变量。在C ++中我会这样做:
const std::string path( "/projects/current" );
如何使用R编程语言执行此操作?
为了清晰起见编辑:我知道我可以在R:
中定义这样的字符串path = "/projects/current"
我真正想要的是一种语言结构,它保证任何人都无法更改与名为“path”的变量相关联的值。
编辑以回复评论:
从技术上讲,const是一个编译时保证,但在我看来,R解释器会使用错误消息抛出停止执行。例如,查看当您尝试将值分配给数字常量时会发生什么:
> 7 = 3
Error in 7 = 3 : invalid (do_set) left-hand side to assignment
所以我真正想要的是一种语言功能,它允许您只分配一次值,当您尝试将新值分配给声明为const的变量时,应该会出现某种错误。我不关心错误是否在运行时发生,特别是如果没有编译阶段。维基百科的定义在技术上可能不是常量,但它非常接近。看起来这在R编程语言中是不可能的。
答案 0 :(得分:42)
请参阅lockBinding
:
a <- 1
lockBinding("a", globalenv())
a <- 2
Error: cannot change value of locked binding for 'a'
答案 1 :(得分:6)
由于您计划将代码分发给其他人,您可以(应该?)考虑创建一个包。在该包中创建一个NAMESPACE。在那里,您可以定义具有常量值的变量。至少对你的包使用的功能。看看Tierney (2003) Name Space Management for R
答案 2 :(得分:5)
我很确定在R中这是不可能的。如果你担心意外地重写值,那么最简单的事情就是将所有常量放入列表结构然后你知道当你使用这些值时。类似的东西:
my.consts<-list(pi=3.14159,e=2.718,c=3e8)
然后,当你需要访问它们时,你会有一个助手回忆录,知道不该做什么,并且它会将它们推出正常的命名空间。
另一个要问的地方是R开发邮件列表。希望这会有所帮助。
答案 3 :(得分:3)
(编辑新主意:) bindenv
函数提供了
实验界面,用于调整环境中的环境和绑定。它们允许锁定环境以及单独的绑定,以及将变量链接到函数。
这似乎可以给出一种虚假的安全感(比如指向非const
变量的const
指针),但它可能有所帮助。
(编辑为焦点:) const
是compile-time guarantee,而不是锁定内存中的位。由于R没有编译阶段,它一次查看所有代码(它是为交互式使用而构建的),因此无法检查未来的指令是否会违反任何保证。如果有正确的方法可以做到这一点,那么R-help列表中的人就知道了。我建议的解决方法:假冒你自己的编译。编写一个脚本来预处理您的R代码,该代码将手动替换“常量”变量的每个外观的相应文字。
(原创:)你希望从一个像C“const”这样的变量中得到什么好处?
由于R只有call-by-value semantics(除非你对环境做了一些修改),所以没有理由担心通过调用它们上的函数来破坏你的变量。如果您担心您和您的协作者意外使用具有相同名称的变量,则采用某种命名约定或使用某种OOP结构可能是正确的解决方案。
您正在寻找的功能可能存在,但我怀疑它是否是R作为一个互动环境的起源,您希望能够撤消您的行为。
答案 4 :(得分:1)
R没有语言常量功能。上面列出的想法是好的;我个人使用像ALL_CAPS这样的命名约定。
答案 5 :(得分:-1)
最简单的R表达式只是一个常量值,通常是数值(数字)或字符值(一段文本)。例如,如果我们需要指定对应于10分钟的秒数,我们指定一个数字。
> 600
[1] 600
如果我们需要指定要从中读取数据的文件的名称,我们将名称指定为字符值。字符值必须用双引号或单引号括起来。
> "http://www.census.gov/ipc/www/popclockworld.html"
[1] "http://www.census.gov/ipc/www/popclockworld.html"