我正在开发一个工作流程,在该工作流程中验证用户提交的数据并运行一些初步统计测试,然后将生成的工作区发送给统计员进行进一步分析。
在某些情况下,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文件时,是否有人知道显示一次性消息的方法,最好是没有?