我正在开发一个工作流程,其中验证用户提交的数据并运行一些初步统计测试,然后将生成的工作空间发送给统计学家进行进一步分析。
在某些情况下,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 成为一个自定义类,并将 S3 打印方法连同它一起保存在 RData 文件中,但并不是每个人都会立即将完整的对象打印到他们的控制台。我可能会尝试一下class()
,head()
谁知道其他人首先会做什么。
该.First()
命令的文档说(强调我的)......
函数“.First”(和“.Last”)可以在适当的“.Rprofile”或“Rprofile.site”文件中定义或保存在“.RData”中。
...但是如果我从已经运行的会话中打开 RData 文件,.First()
则不会执行。
当有人以最少的用户输入(最好是没有输入)打开 RData 文件时,是否有人知道显示一次性消息的方法?