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'
%<c-%
运算符是assign
+ lockBinding
的便捷包装器。
就像 Baptiste 在 cmets 中所说:如果您对此有疑问,则可能是编码风格不佳的迹象。将大部分逻辑捆绑到函数中将减少变量名冲突。
【讨论】:
%<c-%
与x %<c-% 1 + 2
之类的操作一起使用存在危险,它的行为不像x <- 1+2
,这意味着您需要更多的括号与%<c-%
。在我看来,如果使用 final 变量,最好用 lockBinding()
手动声明它们。以上是关于R:避免意外覆盖变量的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化箱图配置抖动数据点(jitter points)避免数据点互相覆盖并使用线条(line)连接两个箱图中不同分组成对的数据点(jitter on Boxplots)
如何避免“意外模块'HttpClientModule'...注释”错误?
R语言ggplot2可视化箱图配置position_dodge参数避免数据点互相覆盖实现抖动数据点(jitter points)并使用线条(line)连接两个箱图中不同分组成对的数据点