Более значимое название окна для Rstudio
Я использую R studio (Версия 1.0.143) под Ubuntu (16.04), и заголовок окна отображает только очень неинформативный "RStudio".
Я хотел бы иметь хотя бы имя текущей вкладки или в идеале полный путь к файлу, соответствующему этой вкладке. Кажется, что под Windows полный путь появляется в заголовке окна.
Это может быть полезно для навигации между окнами, но мое основное предназначение - для программ, отслеживающих время, проведенное в каждой программе (например, arbtt
). На данный момент я могу только знать, что я провел, скажем, 20 часов в R studio на прошлой неделе, но я хотел бы знать, в каких файлах / проектах.
Здесь представлено частичное решение, но если кто-то знает, как получить также полное имя и путь к текущей вкладке, мне все равно интересно.
Основываясь на ответе @Spacedman, я теперь могу получить путь к рабочему каталогу (но не имя скрипта) в заголовке окна, добавив эти строки в /usr/lib/R/etc/Rprofile.site
после установки wmctrl
:
RStudio_title <- function(...){system(paste0('wmctrl -r "RStudio" -N "RStudio - @ ', getwd(), '"')) ; TRUE}
addTaskCallback(RStudio_title, data = NULL, name = character())
Одна из проблем заключается в том, что если у вас уже открыто окно с "rstudio" (без учета регистра) в заголовке (например, в веб-браузере), это окно получит новый заголовок, а не окно Rstudio. E сть -F
возможность сделать заголовок окна строго идентичным заголовку. Я попытался сначала изменить заголовок RStudio на заголовок с меньшей вероятностью присутствия в другом окне, добавив его в Rprofile.site
:
system('wmctrl -F -r "RStudio" -N "RStudio - @ "')
Проблема в том, что system
Rstudio вызывает функции R в Rprofile.site, кажется, игнорируется Rstudio (в то время как он работает из R, вызываемой вне rstudio)
На самом деле, system
команда от Rprofile.site не игнорируется. Он выполняется, но по какой-либо причине выходные данные не отображаются в консоли Rstudio R (например, если вы вводите system("echo 'Hello World'")
). Смотрите обсуждение в этом вопросе
Причина того, что system('wmctrl -F -r "RStudio" -N "RStudio - @ "')
не работает, вероятно, что во время выполнения этой команды (когда Rprofile.site получен от R), окна RStudio еще нет...
Это то, как я делаю сейчас, включая предложения от @Spacedman (т.е. используя шестнадцатеричный идентификатор и if(interactive())
). Это работает хорошо, даже если уже есть другое окно, открытое с "RStudio" в заголовке. Это работает также, если вы перезапустите R из Rstudio. Он будет сломан (с сообщением), если вы выполните 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 ответ
Устанавливать wmctrl
и затем вы можете изменить название чего-то под названием "Калькулятор" на "Fnord" следующим образом:
xcalc &
wmctrl -r Calculator -N "Fnord"
Так что вам просто нужен текущий заголовок ("RStudio"?) Или, возможно, его идентификатор (получить с wmctrl -l
) и там вы идете.
Вы могли бы позвонить из system
в R и вставьте текущий рабочий каталог из getwd()
, Вы можете подключить это к R для выполнения в каждой командной строке, по крайней мере, на обычном R, используя addTaskCallback
, но, возможно, RStudio с этим справляется.
Пример обратного вызова:
Определить функцию:
> f = function(...){cat("Hello\n");TRUE}
Добавьте его к обратным вызовам задачи:
> addTaskCallback(f, data = NULL, name = character())
1
1
Hello
Теперь R говорит "Привет" после каждой команды:
> ls()
[1] "f"
Hello
+ Изменить f
установить заголовок, используя что-то вроде system(paste0("wmctrl ..."))
и там вы идете.