我在R中有一个构建原始数据的函数。我创建了一个名为output
的数据框,然后根据函数值block
创建一个动态变量名。
输出对象确实包含我想要的数据帧,并且在函数结束时动态地重命名它(在函数内):
a = assign(paste("output", block, sep=""), output)
...但是在运行该函数后,没有对象output1(如果block
= 1)。我根本无法检索输出对象,既不是output
也不是动态output1
版本。
我试过这个:
a = assign(粘贴(“输出”,块,sep =“”),输出) 返回(a)中
......但仍然 - 没有成功。 如何检索动态输出变量?我的错误在哪里?
答案 0 :(得分:4)
环境。
默认情况下, 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
但我们的不是为什么......