【问题标题】:Declaring a Const Variable in R在 R 中声明一个常量变量
【发布时间】:2010-10-30 12:30:23
【问题描述】:

我在 R 中工作,我想定义一些我(或我的一位合作者)无法更改的变量。在 C++ 中,我会这样做:

const std::string path( "/projects/current" );

如何在 R 编程语言中做到这一点?

为清楚起见编辑:我知道我可以在 R 中定义这样的字符串:

path = "/projects/current"

我真正想要的是一种语言结构,它保证没有人可以更改与名为“path”的变量关联的值。

编辑以响应 cmets:

从技术上讲,const 是编译时保证,但在我看来,R 解释器会抛出停止执行并显示错误消息是有效的。例如,看看当您尝试为数值常量赋值时会发生什么:

> 7 = 3
Error in 7 = 3 : invalid (do_set) left-hand side to assignment

所以我真正想要的是一种语言功能,它允许您一次且仅一次分配值,当您尝试为声明为 const 的变量分配新值时应该会出现某种错误。我不在乎错误是否发生在运行时,尤其是在没有编译阶段的情况下。根据维基百科的定义,这在技术上可能不是 const ,但它非常接近。看起来这在 R 编程语言中也是不可能的。

【问题讨论】:

    标签: r statistics constants


    【解决方案1】:

    lockBinding:

    a <- 1
    lockBinding("a", globalenv())
    a <- 2
    Error: cannot change value of locked binding for 'a'
    

    【讨论】:

    • 你仍然可以做 rm(a);a
    【解决方案2】:

    由于您计划将您的代码分发给其他人,您可以(应该?)考虑创建一个包。在该包中创建一个 NAMESPACE。在那里您可以定义具有恒定值的变量。至少对于您的包使用的功能。看看Tierney (2003) Name Space Management for R

    【讨论】:

      【解决方案3】:

      我很确定这在 R 中是不可能的。如果您担心不小心重写该值,那么最简单的做法是将所有常量放入一个列表结构中,然后您就知道了当您使用这些值时。比如:

      my.consts<-list(pi=3.14159,e=2.718,c=3e8)
      

      然后,当您需要访问它们时,您有一个助手回忆录来知道不该做什么,并且它会将它们推出您的正常命名空间。

      另一个要问的地方是 R 开发邮件列表。希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        (为新想法编辑:)bindenv 函数提供了一个

        用于调整环境和环境中的绑定的实验界面。它们允许锁定环境以及单独的绑定,以及将变量链接到函数。

        这似乎会给人一种错误的安全感(例如指向非const 变量的const 指针),但它可能会有所帮助。

        (为重点编辑:)constcompile-time guarantee,而不是锁定内存中的位。由于 R 没有一次查看所有代码的编译阶段(它是为交互式使用而构建的),因此无法检查未来的指令是否不会违反任何保证。如果有正确的方法可以做到这一点,R-help 列表中的人们会知道。我建议的解决方法:伪造你自己的编译。编写一个脚本来预处理您的 R 代码,该脚本将为您的“常量”变量的每次出现手动替换相应的文字。

        (原文:)您希望从具有类似于 C“const”的变量中获得什么好处?

        由于 R 仅具有 call-by-value semantics(除非您对环境进行了一些修改),因此没有任何理由担心通过调用变量来破坏变量。如果您担心您和您的合作者不小心使用了具有相同名称的变量,那么采用某种命名约定或使用某种 OOP 结构可能是正确的解决方案。

        您正在寻找的功能可能存在,但我怀疑它源于 R 作为交互式环境,您希望能够撤消您的操作。

        【讨论】:

        • 我不担心调用函数会破坏变量,我只想保证环境中提供的某些变量永远不会改变。我基本上定义了一组分析工具,并且我定义了几个常量用于处理,它们在程序的执行过程中不应该改变。看起来这在 R 中可能很棘手/不可能。
        • 只要这些“常量”有合理的名称,并且您的用户知道如果他们更改它们会发生坏事,那么您可以免除责任,并且专家用户可以在需要时更改它们。俗话说,“常量不,变量不”。
        【解决方案5】:

        R 没有语言常量特性。上面的列表想法很好;我个人使用 ALL_CAPS 之类的命名约定。

        【讨论】:

          【解决方案6】:

          我从this website得到下面的答案

          最简单的 R 表达式只是一个常量值,通常是数值(数字)或字符值(一段文本)。例如,如果我们需要指定对应于 10 分钟的秒数,我们指定一个数字。

          > 600
          [1] 600
          

          如果我们需要指定要从中读取数据的文件的名称,我们将名称指定为字符值。字符值必须用双引号或单引号括起来。

          > "http://www.census.gov/ipc/www/popclockworld.html"
          [1] "http://www.census.gov/ipc/www/popclockworld.html"
          

          【讨论】:

          • 您将常量与分配后无法更改的变量混淆了。
          • @David Locke - 好点。我试图在问题中澄清这一点。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-29
          • 1970-01-01
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          • 2020-06-14
          相关资源
          最近更新 更多