首页 文章

Rstudio更有意义的窗口 Headers

提问于
浏览
3

我在Ubuntu(16.04)下使用R studio(版本1.0.143),窗口 Headers 只显示一个非常无法提供的“RStudio” .

我想至少拥有当前选项卡的名称,或者理想情况下是该选项卡对应文件的完整路径 . 似乎在Windows下,完整路径出现在窗口 Headers 中 .

这对于在窗口之间导航可能很有用,但我的主要用途是用于跟踪每个软件花费的时间的软件(如 arbtt ) . 目前我只知道我上周在R工作室花了20个小时,但我想知道哪些文件/项目 .


这里有一个部分解决方案,但如果有人知道如何获得当前标签的全名和路径,我仍然感兴趣 .


基于@Spacedman回复,我现在可以通过在安装 wmctrl 之后将这些行添加到 /usr/lib/R/etc/Rprofile.site 来获取窗口 Headers 中的工作目录路径(但不是脚本名称):

RStudio_title <- function(...){system(paste0('wmctrl -r "RStudio" -N "RStudio - @ ', getwd(), '"')) ; TRUE}
addTaskCallback(RStudio_title, data = NULL, name = character())

一个问题是,如果您已经在 Headers 中打开了一个带有"rstudio"(不区分大小写)的窗口(例如在Web浏览器中),则此窗口将接收新 Headers 而不是Rstudio窗口 . 有一个 -F 选项可以使窗口 Headers 与提供的 Headers 完全相同 . 我试图通过将此 Headers 添加到 Rprofile.site 来将RStudio Headers 修改为不太可能出现在另一个窗口中的 Headers :

system('wmctrl -F -r "RStudio" -N "RStudio - @ "')

问题是Rprofile.site中的 system R函数调用似乎被Rstudio忽略(虽然它在R中工作,称为rstudio外部)


实际上,Rprofile.site中的 system 命令不会被忽略 . 它被执行但由于任何原因输出未显示在Rstudio R控制台中(例如,如果您键入 system("echo 'Hello World'") ) . 请参阅this question中的讨论
system('wmctrl -F -r "RStudio" -N "RStudio - @ "') 不起作用的原因可能是在执行此命令时(当R来自R的Rprofile.site时),RStudio窗口尚未出现...

这就是我现在所做的,包括来自@Spacedman的提议(即使用十六进制ID和 if(interactive()) ) . 即使在 Headers 中已经打开"RStudio"的另一个窗口,它也能正常工作 . 如果从Rstudio重新启动R,它也可以工作 . 如果你执行 rm(list=ls()) 它将被打破(带有消息)(我个人从不这样做,我更喜欢重新启动R)

if(interactive()) {
    # function to capture the hexadecimal ID of the R studio window
    RStudio_ID <- function(...) {
        Rstudio_wmctrl_ID <<- system("wmctrl -l | grep 'N/A RStudio' | sed -r 's/\\s.*//'", 
            intern = TRUE); FALSE
    }
    # execute last function only once after the first completed top-level task 
    # (because the output of that function is FALSE)
    addTaskCallback(RStudio_ID, data = NULL, name = character())

    # function that will change the Rstudio window title
    RStudio_title <- function(...){system(paste0('wmctrl -i -r ', Rstudio_wmctrl_ID, 
        ' -N "RStudio - @ ', getwd(), '"')) ; TRUE}

    # this function is executed after every completed top-level task
    addTaskCallback(RStudio_title, data = NULL, name = character())
}

1 回答

  • 1

    安装 wmctrl ,然后您可以将名为"Calculator"的 Headers 更改为"Fnord",如下所示:

    xcalc &
     wmctrl -r Calculator -N "Fnord"
    

    所以你只需要当前的 Headers ("RStudio"?)或者它的ID(可以通过 wmctrl -l 获取)然后你去了 .

    您可以在R中从 system 调用此方法并粘贴 getwd() 中的当前工作目录 . 您可以将其挂接到R以在每个命令行上执行,至少在普通R上执行,使用 addTaskCallback ,但也许RStudio可以使用它 .

    示例回调:

    定义一个功能:

    > f = function(...){cat("Hello\n");TRUE}
    

    将其添加到任务回调:

    > addTaskCallback(f, data = NULL, name = character())
    1 
    1 
    Hello
    

    现在R在每个命令后都说“Hello”:

    > ls()
    [1] "f"
    Hello
    

    更改 f 以使用类似 system(paste0("wmctrl ...")) 的内容设置 Headers ,然后你去 .

相关问题