Rで、自分で定義した関数内の処理のようなローカルなスコープから、グローバル変数を定義したり変更したりする操作をしたい場合は、「<<-」を使うことになっていて、
> obj1 <- c("元々1", "元々2") > > myfun <- function(x){ + obj1 <<- c(obj1, x) + } > > myfun('追加') > > print(obj1) [1] "元々1" "元々2" "追加"
こういうふうになるのだが、これはどのグローバル変数を上書きするかは関数定義ないに直接書き込んでしまっているので、それ自体を引数として指定したい場合のやりかたが、よく分からない。
分からないので、文字列をコードとして実行する方法を用いて、無理やり、
> append.global <- function(x, y) { + x.name <- as.character(eval(substitute(alist(x)))) # オブジェクト名を文字列で取得 + code <- paste(x.name, '<<- c(', x.name, ',\"', y,'\")', sep='') + eval(parse(text=code)) # 文字列をコマンドとして実行 + } > > obj1 <- c("元々1", "元々2") > append.global(obj1, '追加') > print(obj1) [1] "元々1" "元々2" "追加"
というふうにしてみたのだが、もっと良い方法はないのだろうか?
関数の返り値を代入する方法だと都合が悪いことがあり、返り値を使わずに関数内の記述だけで上書きしたい。