【问题标题】:Assign variable in Parent Environment of a function在函数的父环境中分配变量
【发布时间】:2017-03-18 11:11:43
【问题描述】:

看下面的例子,我已经为全局环境分配了变量 holder。但是,我想将持有者专门分配给 make.var() 的本地环境。我该怎么做?

make.var<-function(){
  holder<<-rep(NA,10) #assigns global
}

test<-function(){
  make.var()
}

编辑:我认为经常使用“调用环境”而不是“父环境”的术语。

【问题讨论】:

  • 你可以查看?assign——可能在“pos = parent.frame()”中。你为什么不简单地让make.var 返回一个你可以在任何你需要的地方分配的值?
  • @alexis_laz 我会看看它。我基本上必须分配(启动)很多变量。我认为如果我返回这些变量的列表,那会很麻烦。如果将它们全部分配在单行中的父环境中会更容易。
  • 返回一个列表并使用 list2env()

标签: r


【解决方案1】:

您可以使用parent.frame 获取调用环境(不要将其与parent.env 混淆)并使用$[[ 为其分配变量(就像使用列表一样)。 或者你可以使用assign

例如

rm(list = ls())
`%<-1%` <- function(x, y) { p <- parent.frame() ; p[[deparse(substitute(x))]] <- y }
`%<-2%` <- function(x, y) { assign(deparse(substitute(x)), y, env = parent.frame())}

然后:

ls()
a1 %<-1% 111
ls()
a2 %<-2% 222
ls()
a1 ; a2
test1 <- function(x) { print(ls()); t %<-1% x; print(ls()); t }
test2 <- function(x) { print(ls()); t %<-2% x; print(ls()); t }
ls()
test1(333)
ls()
test2(444)
ls()

【讨论】:

  • 仅供参考,如果您需要返回多代,例如您在 apply 函数中有一个 if 语句,在包含要更新的变量的 main 函数中,您可以为 parent.frame() 指定参数 n
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
相关资源
最近更新 更多