apply で呼び出す関数から関数スコープ外の変数を参照/変更したい場合に、グローバル変数を使用する以外のやり方を調べてみた。
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)
結果
### 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 ###:
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)
結果
### 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 に変更されました . . .