присваивать переменные в функции apply () - d, используя << - - PullRequest
3 голосов
/ 09 августа 2010

В R я хочу вызвать применить для огромного data.frame и записать значения обратно в определенные позиции других информационных фреймов.

Однако, используя только «<< -»работает, когда я вызываю функцию apply из глобальной среды.Как я понимаю, «<< -» ищет переменную в parent.env ().Почему родительская среда функции, вызываемой в bar (), не является средой bar?Спасибо! </p>

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 ]

2 голосов
/ 09 августа 2010

Поскольку я нахожусь в пространстве имен пакета, я должен использовать решение, отличное от решения Этьеннебра. И я думаю, что это довольно элегантно: назначить среду 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 голос
/ 09 августа 2010

Кажется, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...