gpt4 book ai didi

R:改进工作流程并跟踪输出

转载 作者:行者123 更新时间:2023-12-04 00:42:58 24 4
gpt4 key购买 nike

我有一个我认为很常见的问题,关于优化 R 中的工作流。具体来说,我如何才能避免文件夹中充满输出(绘图、RData 文件、csv 等)的常见问题,而不需要,一段时间后,了解它们的来源或生产方式?在某种程度上,它肯定涉及尝试对文件夹结构进行智能化。我一直在环顾四周,但我不确定最好的策略是什么。到目前为止,我已经以一种相当简单(矫枉过正)的方式解决了这个问题:我创建了一个函数 metainfo(见下文),它使用给定的文件名写入一个包含元数据的文本文件。这个想法是,如果生成了一个图,则发出此命令以生成一个与图文件名完全相同的文本文件(当然,扩展名除外),其中包含有关系统、 session 、加载的包、R 的信息从中调用元数据函数的版本、函数和文件等。问题是:

(i) 人们如何处理这个普遍问题?是否有明显的方法可以避免我提到的问题?

(ii) 如果没有,有人有改进此功能的提示吗?目前它可能很笨重而且不理想。特别是,获取生成绘图的文件名不一定有效(我使用的解决方案是由@hadley 在 1 中提供的解决方案)。欢迎任何想法!

该函数假定为 git,因此请忽略可能产生的警告。这是主要函数,存储在文件 metainfo.R 中:

MetaInfo <- function(message=NULL, filename)
{
# message - character string - Any message to be written into the information
# file (e.g., data used).
# filename - character string - the name of the txt file (including relative
# path). Should be the same as the output file it describes (RData,
# csv, pdf).
#

if (is.null(filename))
{
stop('Provide an output filename - parameter filename.')
}

filename <- paste(filename, '.txt', sep='')

# Try to get as close as possible to getting the file name from which the
# function is called.
source.file <- lapply(sys.frames(), function(x) x$ofile)
source.file <- Filter(Negate(is.null), source.file)
t.sf <- try(source.file <- basename(source.file[[length(source.file)]]),
silent=TRUE)

if (class(t.sf) == 'try-error')
{
source.file <- NULL
}

func <- deparse(sys.call(-1))

# MetaInfo isn't always called from within another function, so func could
# return as NULL or as general environment.
if (any(grepl('eval', func, ignore.case=TRUE)))
{
func <- NULL
}

time <- strftime(Sys.time(), "%Y/%m/%d %H:%M:%S")
git.h <- system('git log --pretty=format:"%h" -n 1', intern=TRUE)
meta <- list(Message=message,
Source=paste(source.file, ' on ', time, sep=''),
Functions=func,
System=Sys.info(),
Session=sessionInfo(),
Git.hash=git.h)
sink(file=filename)
print(meta)
sink(file=NULL)
}

然后可以在另一个函数中调用,存储在另一个文件中,例如:

source('metainfo.R')

RandomPlot <- function(x, y)
{
fn <- 'random_plot'
pdf(file=paste(fn, '.pdf', sep=''))
plot(x, y)
MetaInfo(message=NULL, filename=fn)
dev.off()
}

x <- 1:10
y <- runif(10)

RandomPlot(x, y)

通过这种方式,生成了一个与绘图同名的文本文件,其中包含的信息有望帮助弄清绘图的生成方式和位置。

最佳答案

就一般的 R 组织而言:我喜欢有一个脚本来重新创建为项目完成的所有工作。任何项目都应该可以通过单击来重现,包括与该项目相关的所有图表或论文。

因此,为了保持井井有条:为每个项目保留一个不同的目录,每个项目都有自己的函数。R 脚本用于存储与该项目关联的非包函数,并且每个项目都有一个主脚本,其开头如下

## myproject
source("functions.R")
source("read-data.R")
source("clean-data.R")

等等……一路走来。这应该有助于保持一切井井有条,如果您获得新数据,您只需转到早期脚本来修复标题或其他内容,然后单击一下即可重新运行整个项目。

关于R:改进工作流程并跟踪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16864196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com