最简单的方法是在RData(R工作空间)文件中嵌入README消息

时间:2013-10-14 18:04:15

标签: r rdata self-documenting

我正在开发一个工作流程,在该工作流程中验证用户提交的数据并运行一些初步统计测试,然后将生成的工作区发送给统计员进行进一步分析。

在某些情况下,RData文件将发送给统计员,在此之前,他不熟悉该项目。我希望他们能够打开RData文件并显示总结项目的消息,告诉他们打开的工作区中包含的内容,以及可以查找更多信息的URL。

问题是,我试图尽可能少地依赖统计员运行命令或加载包。我能想到的最好的是(在创建RData文件期间):

library(stringr);
## the message, wrap it to 40 char because we're being cautious
message <- strwrap("Blah blah this is a message, look at this url http://foo.bar, here is a file listing. To see this information again, please type 'README()'",40);

## override ls 
ls<-README<-function(...) {
  ## prints neatly wrapped message with no line numbers
  cat(paste0(message,collapse='\n'),'\n\n');
  ## capture the execution environment
  pf<-parent.frame(); 
  ## print the requested ls output
  print(base:::ls(...));
  ## if README was invoked as ls, clean it up
  if("ls" %in% base:::ls(pf)) pf$ls<-NULL;}

## generate the RData file, where FOO, BAR, BAZ are, e.g. 
## fitted models or data frames
save(ls,README,message,FOO,BAR,BAZ,file='your_output.RData');

然后your_output.RData是统计员将从其R会话中打开的文件。

这是次优的,因为它假设统计学家将在控制台上键入“ls”而不是让某种接口(例如ESS)为它们执行(并且可能出错)。此外,即使我在用户友好性方面做到这一点,也很难理解他们的基本功能。

我想到的另一件事是将README作为自定义类并在RData文件中保存S3打印方法,但不是每个人都会立即将完整对象打印到他们的控制台。我可能会尝试class()head(),并且知道其他人先做了什么。

.First()命令的文档说(强调我的)......

  

可以适当地定义函数'。first'(和'.Last')   '.Rprofile'或'Rprofile.site'文件或已保存在'.RData'中。

...但如果我从已经运行的会话中打开一个RData文件,则.First()不会执行。

当有人以最少的用户输入打开RData文件时,是否有人知道显示一次性消息的方法,最好是没有?

0 个答案:

没有答案