#author("2019-04-28T10:41:58+00:00","","")
#author("2019-04-28T11:08:31+00:00","","")
#mynavi(R言語入門,R言語の練習)
#setlinebreak(on);

* 目次 [#hb019d07]
#contents
- 関連
-- [[R言語入門]]
-- [[R言語の練習]]

R言語でスコープの外の変数を参照する
* 概要 [#uc585865]
#html(<div style="padding-left: 10px;">)
// 例えば、あるベクトルやデータフレームに対して任意の処理を行なう場合、apply を使用すれば高速に処理を行なう事ができるが、
apply で呼び出す関数から関数スコープ外の変数を参照/変更したい場合に、グローバル変数を使用する以外のやり方を調べてみた。
#html(</div>)

* apply内ではスコープ外の変数は参照できない [#o0fbf9fc]
#html(<div style="padding-left: 10px;">)
#mycode2(){{
testFunc1 <- function(numbers){

  messages <- list()

  result <- lapply(numbers, function(i){
    ret <- i + 1
    messages <- append(messages, paste(i, "は", ret, "に変更されました"))
    return(ret)
  })

  cat("### result ###:\n")
  cat(unlist(result), "\n")
  cat("### messages ###:\n")
  cat(unlist(messages), sep="\n", collapse="")
}

numbers <- 1:50
testFunc1(numbers)
}}

結果
#myterm2(){{
### result ###:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 
### messages ###:

}}
#html(</div>)


* new.env と assign [#u6c50e9b]
#html(<div style="padding-left: 10px;">)
#myterm2(){{
testFunc2 <- function(numbers){
  
  tempenv <- new.env()
  assign("messages", list(), env=tempenv)

  result <- lapply(numbers, function(i){
    ret <- i + 1
    messages <- get("messages", env=tempenv)
    assign("messages", append(messages, paste(i, "は", ret, "に変更されました")), env=tempenv)
    return(ret)
  })

  cat("### result ###:\n")
  cat(unlist(result), "\n")
  cat("### messages ###:\n")
  cat(unlist(get("messages",env=tempenv)), sep="\n", collapse="")
}

numbers <- 1:50
testFunc2(numbers)
}}

結果
#myterm2(){{
### result ###:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 
### messages ###:
1 は 2 に変更されました
2 は 3 に変更されました
3 は 4 に変更されました
4 は 5 に変更されました
5 は 6 に変更されました
6 は 7 に変更されました
7 は 8 に変更されました
8 は 9 に変更されました
9 は 10 に変更されました
.
.
.
}}

#html(</div>)



トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS