在R中传递带有list的散列作为元素

时间:2014-04-11 17:58:16

标签: r hash reference windows-7

我需要在胜利7的R by R studio中通过引用传递。

我的代码:

library(hash)
myfunc<-function(myhash.arg)
{
  myhash <- myhash.arg
  if (!has.key("first", myhash))
    myhash["first"] <- list()
  alist <- myhash["first"]
  alist <- append(alist, 9)
  eval.parent(substitute(myhash.arg<-myhash))
  return(0)
}

ahash<-hash()
for(i in 1:5)
{
  myfunc(myhash.arg = ahash)
  print(c("length of ahash is ", length(ahash)))
  print(c("length of ahash list is ", length(ahash["first"])))
}

但是,列表大小始终为1,错过了附加的元素。

1 个答案:

答案 0 :(得分:1)

在上面对我的评论进行扩展是一种通用但又丑陋的方式,可以在R中“通过引用”传递内容。 假设您在环境e中有一个名为h的对象,并且您希望通过引用将其传递给函数f。你想要这样的东西:

f = function(object) {
     ...
     # assign something into object or manipulate it
     ...
}

f(h)
# now you want to see that h has changed.

以上述方式执行此操作不会更改您的对象,但以下代码将执行此操作:

f = function(env,obj.name) {
    ...
    # the assignment is done as follows
    env[[obj.name]] = ...
    ...
}
f(e,"h")
# now h is changed

例如:

h = list(a=1,c=2)
f = function(e,n) {
    e[[n]]$c = 5
    return(0)
}
f(.GlobalEnv,"h")
h

就是这样。

现在你可以根据你的情况进行调整

当我有大数据集时,我经常使用这种方法。我仍然希望在运行数据集的函数中组织我的工作(例如,使我的分析可重现,或者能够对不同的子集进行相同的分析等),但是对于性能问题,复制数据集是一个问题。所以我创建了一个名为“working.data”的环境,并只将data.frames的名称传递给我的函数。我甚至硬编码数据environemtn的名称(所以我不需要传递它),并处理函数外部环境的命名/重命名。我不确定我会推荐我的解决方案的后一部分。