自动保存和加载历史记录

9

我正在使用R软件进行统计分析,但很遗憾它不会保存和恢复我的提示命令历史记录。事实上,在新启动的交互式R会话中按上箭头键将每次显示一个空白的历史记录。如果能够以类似于ipython的方式来做这件事就太好了。我尝试将此放入我的.Rprofile文件中,但没有成功。从未创建包含我的命令历史记录的文件。

.First <- function(){
        if (!any(commandArgs()=='--no-readline') && interactive()){
                require(utils)
                try(loadhistory(Sys.getenv("R_HISTFILE")))
        }
}

.Last <- function() {
        if (!any(commandArgs()=='--no-readline') && interactive()){
                require(utils)
                try(savehistory(Sys.getenv("R_HISTFILE")))
        }
}

当然,这一行在我的.bash_profile中。
export R_HISTFILE="$HOME/share/r_libs/.history"

所有这些都是通过SSH在运行Linux的远程服务器上发生的。非常感谢您的帮助!

2
这并不是一个答案,但我认为大多数人建议将您想要再次使用的命令保存在脚本中。这样,您就不必浏览整个历史记录以找到您想要的少数命令。 - Aaron left Stack Overflow
3
当然,我会将我的最终流程写成脚本;但是想象一下,如果使用类似于Bash Shell这样的工具而没有跨会话保存历史记录,你也会感到沮丧吧? - xApple
不是的,我会在脚本中输入我想要保留的命令,而将一次性的命令输入到控制台中。实际上,当我忘记将想要保留的内容放入脚本中并不得不在历史记录中查找时,我会感到沮丧。 - Aaron left Stack Overflow
1
你没有提到你使用的UI是什么 - 也许可以尝试使用RStudio或类似的工具? - hadley
@hadley 我只是通过SSH连接到集群上的节点,然后从bash shell启动R提示符。 - xApple
啊,这解释了很多关于什么样的解决方案是可能的以及为什么你关心历史。Hadley的解决方案对你有用吗? - Aaron left Stack Overflow
4个回答

14

在我的~/.profile文件中,我有:

export R_HISTFILE=~/.Rhistory

在我的 ~/.Rprofile 文件中,我有以下内容:

if (interactive()) {
  .Last <- function() try(savehistory("~/.Rhistory"))
}

对我来说这样做可以行(尽管如果你有多个 R 会话打开,它的效果不是很好)


这对我不起作用。它会加载~/.Rhistory中的所有内容,但除非我回答“是”保存工作区图像问题,否则不会在每个会话结束时保存。 - xApple
@xApple 我的配置文件中也有 alias R='R --no-save --no-restore-data --quiet',这样可以避免关闭时出现问题。 - hadley

1

除了设置.Last之外,另一种方法是为.GlobalEnv注册终结器,即使在使用EOF(Windows上的Ctrl+Z和其他地方的Ctrl+D)退出R会话时也会运行该终结器:

if (interactive()) {
  invisible(
    reg.finalizer(
      .GlobalEnv,
      eval(bquote(function(e) try(savehistory(file.path(.(getwd()), ".Rhistory"))))),
      onexit = TRUE))
}

这里有一些额外的小技巧:

  • invisible() 确保 reg.finalizer() 的返回值在 R 启动时不会被打印出来
  • 与 Hadley 的回答相反,.Rhistory 文件保存在当前目录中。 eval(bquote(... .(getwd()) ...)) 在启动时评估 getwd(),因此在退出时使用的是当前目录
  • 设置 onexit = TRUE 确保代码实际运行

0
你可以考虑使用emacs和ESS,它们可以在SSH上很好地工作,并允许将有用的命令保存在单独的文件中,这通常被认为是更强大的方法。

你能否对使用ESS的优缺点进行更多评论,并提供教程? - RNA
那将是一个很好的答案,但不幸的是我无法提供更多。 我最好的建议是找一个使用它的友好同事,并从那里开始。 它与大多数“现代”程序有足够的不同之处,因此亲自得到帮助尤其有帮助。 - Aaron left Stack Overflow

0
如果您使用Rgui:`savehistory()`、`loadhistory()`和`history()`可以完成工作。否则,我猜这取决于IDE。

我现在不感兴趣保存我的会话。我只是希望保留我的历史记录。我还没有使用任何IDE。 - xApple
第一个回答离题了,我很累。 - odessa
1
是的,我已经找到了 savehistory()loadhistory() 命令。我想知道如何在每次新会话创建时自动执行这些命令。 - xApple

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接