基数为R的动态变量

时间:2014-08-13 18:42:23

标签: r

如何在R中创建依赖变量? 例如

a <- 1
b <- a*2
a <- 2
b
# [1] 2

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

4 个答案:

答案 0 :(得分:10)

听起来你正在寻找makeActiveBinding

a <- 1
makeActiveBinding('b', function() a * 2, .GlobalEnv)
b
# [1] 2
a <- 2
b
# [1] 4

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

library(pryr)
b %<a-% (a * 2)

然而,大多数人并不希望变量表现得像这样。因此,如果您正在编写其他人正在阅读的代码,我建议您不要使用此功能。当b更改时明确更新a或使b成为{{{}的函数1}}。

答案 1 :(得分:6)

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

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

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

addTaskCallback(modified)

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

> 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

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

答案 2 :(得分:2)

R不能那样工作。变量仅在分配新值时才会更改。这是一件好事,因为这意味着事情不会神奇地改变。假设在20行时间你想知道b的值?什么时候改变了?它取决于什么?

R不是电子表格。

只是拼出一点。

sales = 100
costs = 90
profit = sales - costs

现在profit的值为10.

sales = 120

sales已更改。

profit = sales - costs

profits更改为30。

如果计算复杂,通常会写一个函数:

computeProfit = function(sales, costs){return(sales - costs)}

然后执行:

profit = computeProfit(sales, costs)

每当您想要计算销售额和成本的利润时。

答案 3 :(得分:0)

虽然你想要做的事情不是完全可能在R中,只需将b简单修改为一个函数并且由于词法作用域,你实际上可以有一个“因变量”(有点)。

定义一个:

a <- 1

像这样定义b:

b <- function() {
    a*2
}

然后,使用b

而不是使用b()来获取b的值
b() ##gives 2
a <- 4
b() ##gives 8