我需要在胜利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,错过了附加的元素。
答案 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的名称(所以我不需要传递它),并处理函数外部环境的命名/重命名。我不确定我会推荐我的解决方案的后一部分。