基数为R的动态变量

use*_*220 4 r

如何在R中创建请求因变量?例如

a <- 1
b <- a*2
a <- 2
b
# [1] 2
Run Code Online (Sandbox Code Playgroud)

但我期待结果4. R如何自动维持关系?非常感谢 解释 - 我正在尝试使用单元格之间的关系(公式或函数)创建excel spreeadsheet.R的输入用于检验csv(相同值,某些函数或公式)并仅输出值

Mat*_*rde 10

这听起来像你在寻找 makeActiveBinding

a <- 1
makeActiveBinding('b', function() a * 2, .GlobalEnv)
b
# [1] 2
a <- 2
b
# [1] 4
Run Code Online (Sandbox Code Playgroud)

如果你想使用Hadley的漂亮pryr软件包,语法会更简单:

library(pryr)
b %<a-% (a * 2)
Run Code Online (Sandbox Code Playgroud)

但是,大多数人并不希望变量表现得像这样.因此,如果您正在编写其他人正在阅读的代码,我不建议使用R的此功能.ba更改或执行b功能时显式更新a.

  • 我不得不补充说:"......并确保调试生成的代码!" ;) (6认同)
  • 我很欣赏最后的警告. (2认同)

Das*_*son 6

警告:这不是一个好主意,只有在你知道自己在做什么的情况下才能使用任务回调.

你可以做这样的事情,但这很乏味,有更好的方法来实现你的目标.您可以创建一个在每个顶级评估之后调用的函数,该评估基本上为您重新分配.

modified <- function(expr, value, ok, visible){
  if(exists("a")){
    assign("b", a*2, env = .GlobalEnv)
  }
  return(TRUE)
}

addTaskCallback(modified)
Run Code Online (Sandbox Code Playgroud)

跑完之后你应该能够得到这个......

> a
Error: object 'a' not found
> b
Error: object 'b' not found
> a <- 2
> a
[1] 2
> b
[1] 4
> a <- 3
> a
[1] 3
> b
[1] 6
Run Code Online (Sandbox Code Playgroud)

请注意,如果要模拟电子表格,最好定义一个函数来获取输入并执行所有必要的计算以获得所需的输出.R不是Excel,如果不像Excel那样对待它会是最好的.

  • Downvote?我警告说这不是一个好主意,但确实解决了这个问题...... (4认同)
  • @Aristocrates你可以在我的帖子中使用这个方法稍微更懒,但它需要更多的工作,并且很容易搞砸回调.我更喜欢你的方法.实际上我通常会像Spacedman在他的帖子中所做的那样做事,只是有一个脚本来完成所有的计算,但是我喜欢这些方法中的任何一种方法.我只是觉得,因为技术上可以做他们想做的事情,即使我认为这不是一个好主意,我也会提供答案. (2认同)