检查R是否在RStudio中运行

42

我正在寻找一种方法来测试R是否是从RStudio运行的。昨天我在Google上找到了答案,但今天却找不到了。但我认为这可能与测试某个系统变量是否被设置有关。

10个回答

63

这是来自?rstudio

# Test whether running under RStudio 
isRStudio <- Sys.getenv("RSTUDIO") == "1"

另外还有rstudioapi::isAvailable(),但是检查这个不太可靠,因为RStudio似乎并不需要rstudioapi包才能正常工作。


22

5
很遗憾,这个方案并不完美——.Platform$GUI在用户执行.Rprofile之后才被设置(由于某些复杂的原因),因此它不能满足启动脚本的需求。一般来说,最好检查RSTUDIO环境变量。 - Kevin Ushey
1
@KevinUshey,对于在家跟着学习的人,建议的方法是krlmlr提到的:Sys.getenv("RSTUDIO") == "1"?不过,查看由krlmlr提到的rstudioapi::isAvailable,也显示在检查中使用了.Platform$GUI - coatless
3
我认为这可能是rstudioapi中的一个错误 :) 我会提交一个问题! - Kevin Ushey
7
请注意,尽管 Kevin 的评论存在问题,但这段话正确区分了在 RStudio 控制台中运行的代码和在 RStudio 终端选项卡中运行的代码,与 RSTUDIO 环境变量不同。 - Hugh
这是“manipulate”包中采用的方法,用于区分IDE是否为RStudio。顺便说一句。 - epsilone
为了完整起见,“box”包中的RStudio检测实现(https://github.com/klmr/box/blob/62cfa4f4a0b836fcadbc7a63de6b9b56857ffb8b/R/paths.r#L185-L195)将此答案与@KevinUshey的评论结合在一起。我发现这是唯一稳健的方法。 - Konrad Rudolph

11

在RStudio内部没有运行的概念。 RStudio仅是包装在R周围的IDE层;在一天结束时,它只是启动正常的R可执行文件,您需要将其放在$PATH上以便操作RStudio。

作为代理和R Studio,您可以测试available.packages()来查看'manipulate'软件包是否可用,或者通过较短的版本查看RStudio是否已将自己添加到.libPaths()内容中:

R> any(grepl("RStudio", .libPaths()))
[1] TRUE
R> 
R> 

2020年5月或8年后进行编辑 这个问题确实存在,可以从内部查询各种内容。这是来自RStudio终端的一个示例:

$ env | grep -i rstudio | sort
GIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/rstudio.desktop
PATH=[...redacted...]
RMARKDOWN_MATHJAX_PATH=/usr/lib/rstudio/resources/mathjax-27
RS_RPOSTBACK_PATH=/usr/lib/rstudio/bin/rpostback
RSTUDIO=1
RSTUDIO_CONSOLE_COLOR=256
RSTUDIO_CONSOLE_WIDTH=111
RSTUDIO_PANDOC=/usr/lib/rstudio/bin/pandoc
RSTUDIO_PROGRAM_MODE=desktop
RSTUDIO_PROJ_NAME=chshli
RSTUDIO_SESSION_ID=9C62D3D4
RSTUDIO_SESSION_PORT=13494
RSTUDIO_TERM=2BD6BB88
RSTUDIO_USER_IDENTITY=edd
RSTUDIO_WINUTILS=bin/winutils
$ 

同样,在 R 会话内:

R> se <- Sys.getenv()
R> se[grepl("rstudio",se,ignore.case=TRUE)]
GIO_LAUNCHED_DESKTOP_FILE        /usr/share/applications/rstudio.desktop
PATH                             [...also redacted...]
RMARKDOWN_MATHJAX_PATH           /usr/lib/rstudio/resources/mathjax-27
RS_RPOSTBACK_PATH                /usr/lib/rstudio/bin/rpostback
RSTUDIO_PANDOC                   /usr/lib/rstudio/bin/pandoc
R> 

在2021年8月或九年后进行编辑 由于这里列出的所有答案仍可能对某些人来说过于繁琐,您还可以从CRAN安装包rstudioapi,然后通过rstudioapi :: isAvailable()查询它,在RStudio中返回TRUE,在ESS /标准R中返回FALSE


只有在.libPaths没有被脚本更改的情况下,这才有效。而在我公司的设置中,这是成立的。 - RockScience
1
好吧,就像他们说的那样,“如果你把它弄坏了,你就可以留下这些碎片”。 - Dirk Eddelbuettel
1
另一种解决方案(但是需要注意,如果您没有手动加载rstudio,则无法正常工作;) "package:rstudio"%in%search() - RockScience
这个在我的RStudio 1.1.442中失败了,使用sessionInfo()得到的是R version 3.5.0 (2018-04-23), Platform: x86_64-apple-darwin15.6.0 (64-bit), Running under: macOS High Sierra 10.13.6 - miguelmorin

8

当我启动RStudio时,工具:rstudio似乎在搜索路径的第二个位置上。它有一个名为"RStudio.version"的函数,该函数未经记录,但似乎返回RStudio版本字符串:

> RStudio.version()
[1] "0.96.316"

因此,您可以定义:

is.RStudio <- function(){
  if(!exists("RStudio.version"))return(FALSE)
  if(!is.function(RStudio.version))return(FALSE)
  return(TRUE)
}

或许可以利用这个。


1
也许现在应该使用rstudio::versionInfo()$version而不是rstudio::version() - krlmlr

7
截至今日,有一些软件包包含用于检查RStudio是否正在运行的函数:
rstudioapi::isAvailable()
assertive::is_rstudio()

(列表不全)

assertiveassertive.reflections包分别包含其他功能,用于检查其他IDE、RStudio的桌面/服务器版本以及各种R版本(例如alpha、beta、devel、release、patched等)。


3

在我的设置中,无论是在 Rstudio 内部还是外部运行,Sys.getenv("RSTUDIO_USER_IDENTITY") 都会返回 ""。 - RockScience
我检查过了,在我的Windows 7桌面上仍然可以正常工作。我还在运行Ubuntu和RStudio Server的Virtual Box上进行了测试。请指定您的设置,以便其他人可以检查。 - Dieter Menne
你想知道什么?packageVersion("rstudio") 返回 '0.97.551',version 返回:平台 x86_64-w64-mingw32,架构 x86_64,操作系统 mingw32,系统 x86_64,mingw32,版本字符串 R version 3.1.1 (2014-07-10)。 - RockScience

2
现在可以通过 startup 包中的 is_rstudio_console 函数来实现简洁的解决方案。
startup:::is_rstudio_console()
[1] TRUE

值得一提的是,这个函数会检查两个环境变量,RSTUDIO,这在答案中被@krlmr提到,以及RSTUDIO_TERM,目前在之前的答案中似乎没有提到。

function ()
{
    (Sys.getenv("RSTUDIO") == "1") && !nzchar(Sys.getenv("RSTUDIO_TERM"))
}

2
我发现以下方法适合我。
checkRstudio <- function () {
  return ("tools:rstudio" %in% search())
}

我自己对R也比较新,但是我相信为了运行Rstudio,必须加载“tools:rstudio”包。


到目前为止,它似乎比其他答案更可靠,谢谢。 - RockScience
1
不一定。这可以在“选项”中进行调整,并在“.Rprofile”中更改,以便在启动时不加载它。 - Rich Scriven

2

检测代码是否在主RStudio R会话中运行(不依赖于rstudioapi包)的最可靠方法是:

commandArgs()[[1L]] == "RStudio"

对其他答案的一些评论:

  • 仅检查环境变量可能不足,因为"RSTUDIO"环境变量也将被从主R会话启动的子R进程继承。

  • RStudio直到运行R配置文件(例如~/.Rprofile)之后才初始化其R基础设施,因此在这种情况下,检查像.Platform$GUI == "RStudio""tools:rstudio" %in% search()rstudioapi::isAvailable()这样的内容将无法提供所期望的结果。


0

只有在Mac上,才能使用Sys.getenv来获取答案。

平台 x86_64-apple-darwin10.8.0
版本字符串 R version 3.1.0 (2014-04-10)

Sys.getenv("RSTUDIO")=="1" [1] TRUE

RStudio.version() 错误:找不到函数“RStudio.version”

any(grepl("RStudio", .libPaths())) [1] FALSE

.libPaths() [1] "/Library/Frameworks/R.framework/Versions/3.1/Resources/library"


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