Rでパッケージ作るときにパッケージ変数として扱いたいものを
pit_dir <- file.path(Sys.getenv("HOME"),".pit")
pit_config <- file.path(pit_dir,"pit.yaml")
pit_profile_file <- NULL
と先頭に書いておきたいのだけどNAMESPACEファイルを作成すると
> library(pit)
要求されたパッケージ yaml をロード中です
> pit.switch("test")
以下にエラー pit.switch("test") :
'pit_profile_file' に対するロックされたバインディングの値は変更できません
とでる。ちなみにpit.switchはこれ
pit.switch <- function(name=NULL){
if(is.null(name)) name <- "default"
pit_profile_file <<- file.path(pit_dir, paste(name, ".yaml", sep=""))
config <- pit.config()
ret <- config$profile
config$profile <- name
write(as.yaml(config),pit_config)
if(name != ret) write(paste("Profile switch to",name,"from",ret), stderr())
return(ret)
}
環境をとってきてunlockBindingすればいいんだろうなぁと思うんだけどやり方が分からなくて、
pit_dir <- file.path(Sys.getenv("HOME"),".pit")
pit_config <- file.path(pit_dir,"pit.yaml")
#pit_profile_file <- NULL
assign("pit_profile_file",NULL,pos =".GlobalEnv")
とやって、直接大域環境に変数をセットしてるんだけど、これって本当はどうするのがいいんだろうか?
追記10.07.08
環境オブジェクトを作るという方法もあるそうなので、こっちでやってみた。
pit_dir <- file.path(Sys.getenv("HOME"),".pit")
pit_config <- file.path(pit_dir,"pit.yaml")
conf<-new.env()
conf$pit_profile_file <- NULL
こっちのほうが精神衛生上よろしいかも。それにしてもRの環境ってなんだろか?Lispみたいな感じで考えとけばいいのかな?あとでソースコードを探ってみよう。
参考