R:避免意外覆盖变量

Posted

技术标签:

【中文标题】R:避免意外覆盖变量【英文标题】:R: Avoid accidently overwriting variables 【发布时间】:2014-03-21 15:15:09 【问题描述】:

有什么方法可以在命名空间的 R 中定义一个变量,这样它就不会被覆盖(也许是一个“最终”声明)?类似于以下伪代码:

> xvar <- 10
> xvar
[1] 10
xvar <- 6
> "Error, cannot overwrite this variable unless you remove its finality attribute"

动机:多次运行 R 脚本时,有时很容易无意中覆盖变量。

【问题讨论】:

函数式语言的最佳实践是尽可能避免使用全局变量。使用函数,里面的改动不会影响你的全局环境。 【参考方案1】:

查看? lockBinding:

a <- 2
a
## [1] 2
lockBinding('a', .GlobalEnv)
a <- 3
## Error: cannot change value of locked binding for 'a'

及其补充,unlockBinding

unlockBinding('a', .GlobalEnv)
a <- 3
a
## [1] 3

【讨论】:

请注意可能的副作用。 (比如不小心解锁绑定了不应该解锁的东西) @CarlWitthoft 看起来不错,但你有例子吗? 如果我能找到它,我会的谨慎。 是否有办法自动锁定所有创建的变量?并且仅在需要时解锁绑定?【参考方案2】:

您可以使用pryr 包使变量保持不变。

install_github("pryr")
library(pryr)

xvar %<c-% 10
xvar
## [1] 10
xvar <- 6
## Error: cannot change value of locked binding for 'xvar'

%&lt;c-% 运算符是assign + lockBinding 的便捷包装器。


就像 Baptiste 在 cmets 中所说:如果您对此有疑问,则可能是编码风格不佳的迹象。将大部分逻辑捆绑到函数中将减少变量名冲突。

【讨论】:

%&lt;c-%x %&lt;c-% 1 + 2 之类的操作一起使用存在危险,它的行为不像x &lt;- 1+2,这意味着您需要更多的括号与%&lt;c-%。在我看来,如果使用 final 变量,最好用 lockBinding() 手动声明它们。

以上是关于R:避免意外覆盖变量的主要内容,如果未能解决你的问题,请参考以下文章

避免在 R 中覆盖文本文件

R语言ggplot2可视化箱图配置抖动数据点(jitter points)避免数据点互相覆盖并使用线条(line)连接两个箱图中不同分组成对的数据点(jitter on Boxplots)

如何避免“意外模块'HttpClientModule'...注释”错误?

R语言ggplot2可视化箱图配置position_dodge参数避免数据点互相覆盖实现抖动数据点(jitter points)并使用线条(line)连接两个箱图中不同分组成对的数据点

避免用户意外打开 Xcodeproj 而不是 Xcworkspace

R基本问题:避免多次使用数据框名称进行添加