目次

概要

apply で呼び出す関数から関数スコープ外の変数を参照/変更したい場合に、グローバル変数を使用する以外のやり方を調べてみた。

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 ###:

new.env と assign

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 に変更されました
.
.
.

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