2

にファイルfoo.Rと正規表現のリストがあるとしますrex.txt。私が入れたら

rex <- paste(read.table("rex.txt", stringsAsFactors=FALSE)[[1]],collapse="|")

に、を使用してロードするとfoo.R、変数rexは正しく初期化されます。後者をコンパイルしてロードすると、同じことが起こります。これは良いことです。foo.Rlibrary()foo.Rfoo.Rc

しかし、私が望むのは、 variable のリテラル値が(呼び出したときに) にrex含まれていることです。つまり、がロードされたときに、 Emacs Lisp と同様に、コンパイル時に含まれていたものから variable が初期化されます(この方法では実際に実行しているサーバーにコピーする必要があります)。foo.Rccmpfilefoo.Rcrexrex.txteval-when-compilerex.txtfoo.Rc

出来ますか?

4

2 に答える 2

2

以下に示すように、foo.R コンパイルの直前に変更できます。

テストデータ:

text <- '
doSomething()
rex <- paste(read.table("rex.txt", stringsAsFactors=FALSE)[[1]],collapse="|")
doOtherStuff()
'

writeLines(text,"foo.R")

コード:

foo <- readLines("foo.R")

pattern <- "^rex\\s*<-.*$"

eval(parse(text=grep(pattern, foo, value=TRUE))[[1]])

newtext <- gsub(pattern, paste("rex <-",deparse(rex)), foo)

writeLines(newtext,"foo.R")

グローバル環境でこのオブジェクトを作成eval()する行を実行して、それを見つけることができることに注意してください。また、使用済みと一致する行が1つしかないと仮定しています。rex <- ...deparse()pattern

于 2013-09-04T21:42:24.737 に答える