Сохраните все функции в txt файле

Обычно я запускаю много симуляций в 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
[[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)
}
code.txt",sep=""),sep="\n",append=FALSE)

сразу после загрузки всех функций в моем env. Однако в результирующем текстовом файле функции 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)
}

Итак, в двух словах, я хотел бы сделать esse

[[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)
}
code.txt R-читаемым.


person user189035    schedule 22.01.2013    source источник
comment
Не могли бы вы использовать файл .Rhistory для получения информации, которую вы пытаетесь захватить? У меня нет копии под рукой, чтобы попробовать это прямо сейчас ...   -  person Floris    schedule 22.01.2013
comment
Относится к (дубликат?): stackoverflow.com/q/11986574/271616   -  person Joshua Ulrich    schedule 22.01.2013


Ответы (1)


Вы могли бы использовать

dump(lsf.str(), file="essayloadcode.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"

И если вы просто хотите проверить тело функции в eassayloadcode.Rd:

e<-new.env()
load('essay_4_code.Rd', e)
as.list(e)
# $f
# function () 
# x + 1
# <environment: 0x000000000a7b2148>
# 
# $g
# function () 
# y + 1
person Matthew Plourde    schedule 22.01.2013