在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()
)。
答案 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))