2

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

在某些情况下,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 文件时,是否有人知道显示一次性消息的方法?

4

0 回答 0