2

私は通常、で多くのシミュレーションを実行しRます。シミュレーションの合間に、Rコードの一部が変更されます。通常、シミュレーション結果と一緒に、そのシミュレーションで使用されるすべての関数の定義を含む.txtファイルを保持します。その.txtファイルを作成するには、次の行を実行するだけです。

for(j in 1:length(ls()))    print(c(ls()[j],eval(as.symbol(ls()[j]))))
out<-capture.output(for(j in 1:length(ls()))    print(c(ls()[j],eval(as.symbol(ls()[j])))))
cat(out,file=paste("essay_4_code.txt",sep=""),sep="\n",append=FALSE)

私の環境にすべての関数をロードした直後。ただし、結果のテキストファイルでは、R関数はRが関数として解釈できる形式ではありません。理由を理解するために、ここに簡単な例があります:

rm(list=ls())
foo1<-function(x){
  sin(x)+3
}
foo2<-function(x){
  cos(x)+1
}
foo3<-function(x){
  cos(x)+sin(x)
}

降伏します:

[[1]]
[1] "foo1"

[[2]]
function (x) 
{
    sin(x) + 3
}

[[1]]
[1] "foo2"

[[2]]
function (x) 
{
    cos(x) + 1
}

[[1]]
[1] "foo3"

[[2]]
function (x) 
{
    cos(x) + sin(x)
}

つまり、一言で言えば、essay_4_code.txtをRで読み取り可能にしたいのです。

4

1 に答える 1

5

あなたが使うことができます

dump(lsf.str(), file="essay_4_code.R")

これにより、現在の検索スペースにすべての関数定義を含む.Rファイルが作成されます。

編集:

コメントで@JoshuaUlrichによって投稿された関連する質問から:

...dump("f") will only save the function definition of f, and not its environment. 
If you then source the resulting file, f will no longer work correctly [if it 
depends on variables in the environment in was previously bound to].

saveまたは、関数を使用して、関数で読み取り可能なバイナリ形式で関数を保存することもできますload。これにより、関数の環境バインディングは保持されますが、結果のファイルを自分で読み取ることができなくなります。

 do.call(save, c(as.list(lsf.str()), file='essay_4_code.Rd'))

新しいセッションでロードすると、以前にグローバル環境にバインドされていた関数は現在のグローバル環境にバインドされますが、別の環境にバインドされた関数はその環境を持ち運びます。

rm(list=ls())
# function bound to non-global environment
e <- new.env()
e$x <- 10
f <- function() x + 1
environment(f) <- e
# function bound to global environment
y <- 20
g <- function() y + 1
# save functions
do.call(save, c(as.list(lsf.str()), file='essay_4_code.Rd'))

# fresh session
rm(list=ls())

load('essay_4_code.Rd')
f()
# [1] 11
g()
# Error in g() : object 'y' not found
y <- 30
g()
# [1] 31
ls()
# [1] "f" "g" "y"

そして、'eassay_4_code.Rd'の関数の本体を調べたいだけの場合:

e<-new.env()
load('essay_4_code.Rd', e)
as.list(e)
# $f
# function () 
# x + 1
# <environment: 0x000000000a7b2148>
# 
# $g
# function () 
# y + 1
于 2013-01-22T15:55:06.087 に答える