在apply() - d函数中使用<< - 分配变量

时间:2010-08-09 12:17:33

标签: r

在R中,我想在一个巨大的data.frame上调用 apply ,并将值写回其他数据帧的特定位置。

但是,使用'<< - < - '仅在我从全局环境调用apply函数时才有效。据我所知,'<< - ''在parent.env()中搜索变量。为什么在bar()中调用的函数的父环境不是bar的环境? 谢谢!

do_write_foo1 <- function(x) {
    cat("parent environment of function called in bar():  ")
    print(parent.env(environment()))
    foo1[x['a']] <<- 100+x['a']
}
do_write_foo2 <- function(x) {
    foo2[x['a']] <<- 100+x['a']
}

bar <- function() {
    cat("bar environment:  ")
    print(environment())
    foo1 <- 1:10
    apply(data.frame(a=1:10),1,do_write_foo1)
    foo1
}

# this does not work:    
bar()
# bar environment:  <environment: 0x3bb6278>
# parent environment of function called in bar():  <environment: R_GlobalEnv>
# Error in foo1[x["a"]] <<- 100 + x["a"] : object 'foo1' not found


# this works:
foo2<-1:10
apply(data.frame(a=1:10),1,do_write_foo2)
foo2
#  [1] 101 102 103 104 105 106 107 108 109 110

2 个答案:

答案 0 :(得分:2)

由于我在包名称空间内,我必须使用与Etiennebr不同的解决方案。我认为它相当优雅:将bar的环境分配给do_write_foo1。

do_write_foo1 <- function(x) {
    cat("parent environment of function called in bar():  ")
    print(parent.env(environment()))
    foo1[x['a']] <<- 100+x['a']
}

bar <- function() {
    cat("bar environment:  ")
    print(environment())
    foo1 <- 1:10
     environment(do_write_foo1) <- environment()
    apply(data.frame(a=1:10),1,do_write_foo1)
    foo1
}

# now it works:    
bar()

答案 1 :(得分:1)

似乎R没有在函数内部搜索(我不明白为什么),所以你需要将值赋给global.env foo。

bar <- function() {
    foo <<-1:10
    apply(data.frame(a=1:10),1,do_write_foo)
    foo
}
bar()
# [1] 101 102 103 104 105 106 107 108 109 110