【问题标题】:Dynamic variables in base R基础 R 中的动态变量
【发布时间】:2014-08-14 03:42:51
【问题描述】:

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

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

但我期待结果 4. R 如何自动维护关系? 非常感谢 说明 - 我正在尝试使用单元格之间的关系(公式或函数)创建一些作为 excel 电子表格的东西。 R 的输入是例如 csv(相同的值,一些函数或公式),并且只输出值

【问题讨论】:

  • 我不明白,每次换a更新b有什么难度,甚至更好,不要用b,直接用1*2
  • 我认为 OP 要求做一些不可取的事情,但我认为他们想要做什么很清楚。由于“不清楚你在问什么”,我不同意近距离投票。
  • 请注意,我会否决一些“不好的想法”,因为尽管这 可能的,但它在 R 中是非常不明智的,它可能只应该被使用由知道自己在做什么的专家。希望回答者不要太介意,但我认为 R 初学者需要指出正确的方向。
  • @Spacedman 我不关心否决票,但我非常不同意你的方法。我警告说这不是一个好主意。还有其他答案可以提供更好的选择,但我的答案确实解决了问题中提出的问题。我恳请您恢复您的反对票,而是让 cmets 引起您的关注。此外,您似乎对其他答案投了反对票(也许不是您?)但这对我来说似乎是错误的。
  • @Spacedman 我不明白投票的必要性,为什么不发表评论?另外,我不明白我的解决方案是如何“非常不明智”的,它只是说明了词法范围的使用

标签: r


【解决方案1】:

听起来你正在寻找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)

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

【讨论】:

  • 我觉得有必要补充一下:“...一定要在调试生成的代码时玩得开心!” ;)
  • 感谢最后添加的警告。
【解决方案2】:

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

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

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 那样对待它。

【讨论】:

  • 我赞成反对反对票。这样做有什么好处,而不是我在下面的回答中的方式(至少在用户在 R 中交互工作并在该环境中定义函数的上下文中)?
  • @Aristocrates 您可以对我帖子中的方法稍微懒一点,但它需要更多的前期工作,而且很容易弄乱回调。我更喜欢你的方法。实际上,我通常会按照 Spacedman 在他的帖子中所做的那样做事情,并且只有一个脚本来进行所有计算,但是我更喜欢这些方法中的任何一种,而不是我的答案中的方法。我只是觉得,既然技术上可以做他们想做的事,我会提供这个答案,即使我认为这不是一个好主意。
【解决方案3】:

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)

当您想从销售和成本中计算利润时。

【讨论】:

    【解决方案4】:

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

    定义一个:

    a <- 1
    

    像这样定义 b:

    b <- function() {
        a*2
    }
    

    那么,不要使用b来获取b的值,而是使用b()

    b() ##gives 2
    a <- 4
    b() ##gives 8
    

    【讨论】:

    • 永远不要说某事在 R 中是不可能的;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2015-04-07
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-02-07
    相关资源
    最近更新 更多