【问题标题】:Retrieve/access dynamic variable from R function从 R 函数中检索/访问动态变量
【发布时间】:2014-11-24 21:43:20
【问题描述】:

我在 R 中有一个函数来构建我的原始数据。我创建了一个名为output 的数据框,然后想要根据函数值block 生成一个动态变量名称。

输出对象确实包含我想要的数据框,并动态重命名它,在函数的末尾我这样做(在函数内):

a = assign(paste("output", block, sep=""), output)

...但是在运行函数后没有对象 output1(如果block = 1)。我根本无法检索输出对象,既不能检索output,也不能检索动态output1 版本。

然后我试过了:

a = assign(paste("output", block, sep=""), output) 返回(一)

...但仍然 - 没有成功。 如何检索动态输出变量?我的错在哪里?

【问题讨论】:

  • 如果没有可重现的示例(包括函数),几乎不可能说出错误在哪里

标签: r function


【解决方案1】:

环境。

assign 默认情况下会在调用它的环境中创建一个变量。在此处阅读有关环境的信息:http://adv-r.had.co.nz/Environments.html

我假设你正在做类似的事情:

foo <- function(x){ assign("b", x); b}

如果您运行foo(5),您会看到它按预期返回5(暗示b 已在某处成功创建),但b 不会在您当前的环境中存在。

但是,如果你这样做

foo <- function(x){ assign("b", x, envir=parent.frame()); b}

在这里,您在调用 assign 时没有分配给当前环境(恰好是 foo 的环境)。相反,您正在分配到父环境(由于您直接调用此函数,它将成为您的环境)。

所有这些复杂性都应该向您表明这将是相当复杂的,维护起来是一场噩梦,从维护的角度来看是一个非常糟糕的主意。像这样的东西你肯定会更好:

foo <- function(x) { return(x) };
b <- foo(5)

或者如果您需要返回多个项目:

foo <- function(x) { return(list(df=data.frame(col1=x), b=x)) }
results <- foo(5)
df <- results$df
b <- results$b

但我们的理由不是……

【讨论】:

  • 您可以将 parent.env(environment()) 替换为 parent.frame() 以获得更清晰的语义:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2017-06-21
  • 2018-02-28
相关资源
最近更新 更多