以交互方式运行代码选择

时间:2017-10-05 18:11:39

标签: r rstudio

在RStudio IDE中,有没有办法运行选择同时提交所有选择行的代码(如全部运行,但是用于选择)而不是顺序提交,从而保留{{1}的交互性质命令?

背景

我有一个函数定义,后跟一些命令,类似于:

menu()

运行脚本(例如,在Windows RStudio IDE,全部运行或Ctrl-Alt-R中),按预期工作...

运行所有控制台输出(正常)

f1 <- function(x){
  if( x == 'questionable_value'){
    if( menu( title = 'Detected a questionable value',
              choices = c('[Abort process]',
                          'Continue with questionable value (not recommended)')
             ) %in% c(0L,1L) ){
      stop('Process stopped by user.') 
      } else warning('Questionable value ignored by user.')
  }
  return(paste('Did something with',x))
}
f1('foo')
f1('questionable_value')
f1('bar')

如果用户输入2,则:

> source('~/.active-rstudio-document', echo=TRUE)

> f1 <- function(x){
+   if( x == 'questionable_value'){
+     if( menu( title = 'Detected a questionable value',
+               choices = c('[Abort  .... [TRUNCATED] 

> f1('foo')
[1] "Did something with foo"

> f1('questionable_value')
Detected a questionable value 

1: [Abort process]
2: Continue with questionable value (not recommended)

这就是我想要的。

问题在我运行选择时出现(例如,按Ctrl-Enter,或单击“运行”图标) - 即使该选择是整个R文件

运行选择控制台输出(不起作用)

Selection: 2
[1] "Did something with questionable_value"

> f1('bar')
[1] "Did something with bar"
Warning message:
In f1("questionable_value") : Questionable value ignored by user.

在运行选择的情况下,> f1 <- function(x){ + if( x == 'questionable_value'){ + if( menu( title = 'Detected a questionable value', + choices = c('[Abort process]', + 'Continue with questionable value (not recommended)') + ) %in% c(0L,1L) ){ + stop('Process stopped by user.') + } else warning('Questionable value ignored by user.') + } + return(paste('Did something with',x)) + } > f1('foo') [1] "Did something with foo" > f1('questionable_value') Detected a questionable value 1: [Abort process] 2: Continue with questionable value (not recommended) Selection: f1('bar') Enter an item from the menu, or 0 to exit Selection: 不是在等待用户输入,而是将{1}}作为脚本的下一行(menu())。

1 个答案:

答案 0 :(得分:2)

RStudio与标准的R前端做同样的事情:&#34;运行选择&#34;复制所选文本,并将其粘贴到控制台中。

要获得所需内容,您需要从剪贴板复制所选文本和来源。不幸的是,这并不容易,但是这里有一些代码可以提供帮助:

readClipboard <- function() {
  if (.Platform$OS.type == "windows") 
    lines <- readLines("clipboard")
  else
    lines <- system("pbpaste", intern=TRUE)
  lines
}

此功能适用于Windows和其他具有pbpaste命令的系统。它内置在MacOS上,并且有关于在Linux上模拟它的说明:https://whereswalden.com/2009/10/23/pbcopy-and-pbpaste-for-linux/

然后要获取所选文本,您需要复制它(Ctrl-C)并运行

source(textConnection(readClipboard()))

由于RStudio具有API和可安装命令(请参阅https://rstudio.github.io/rstudioaddins/),因此您可以将所有这些(或等效的)放入在击键时自动运行的代码中。 这是一个大多未经测试的版本:

library(rstudioapi)
selection <- primary_selection(getSourceEditorContext())$text
source(textConnection(selection))