#author("2019-04-28T11:08:31+00:00","","") #mynavi(R言語入門,R言語の練習) #setlinebreak(on); * 目次 [#hb019d07] #contents - 関連 -- [[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>)