尝试读取输入时尝试使用“连接”会导致R冻结或崩溃

时间:2017-12-22 19:40:19

标签: r rstudio

抱歉,我在标题中使用的术语可能无法正确使用。每当我尝试运行此代码时,似乎它正在尝试运行它但从未完成命令。当我单击停止命令符号(红色)时,它不执行任何操作。我无法关闭R.所以为什么这会永远运行?

con <- file('stdin', open = 'r')

inputs <- readLines(con)

2 个答案:

答案 0 :(得分:5)

在RStudio中工作时,您需要使用readLines(stdin())而不是readLines(file('stdin')),但如果在终端中运行R,则可以使用它。

但是,由于您使用的是RStudio,因此未指定输入行数也存在问题。从stdin读取输入时, Ctrl + D 表示输入结束。但是,如果您是从RStudio而不是从终端Ctrl+D is unavailable执行此操作,那么如果不指定输入行,则无法终止从stdin读取。

因此,如果您从终端运行R,则代码将起作用,并通过 Ctrl + D 发出输入结束信号。如果您必须使用RStudio,您仍然可以使用readLines(stdin()) if you know the number of lines of input;如,

> readLines(stdin(), n=2)
Hello
World
[1] "Hello" "World"

另一种解决方法是使用scan(),例如:

> scan(,'')
1: Hello
2: World
3: 
Read 2 items
[1] "Hello" "World"

(在第三行我刚按了 Enter 来终止输入)。这样做的好处是您不需要事先知道输入行数。

答案 1 :(得分:1)

RStudio与R有点间接连接(至少4 years ago它将stdin重定向到无处)。出于我们的目的,它可能是嵌入式的。这可能是stdin()与readLines配对时可以工作的部分原因(它创建了一个终端连接而不是文件连接)。 @ duckmayr的scan()解决方案非常好,并且记录为在这种情况下有效的东西...

  

从中读取数据值的文件的名称。如果指定的文件是   “”然后输入来自键盘(或任何stdin()读取   如果重定向输入或嵌入R)。

如果你想考虑一个空白输入'okay',你也可以循环获取一行中带有一些sentinel值的数据,即使循环停止的东西(这里是'EOF')。

input <- function() {
  entry <- ''
  while (!any(entry == "EOF")) {
    entry <- c(readline(), entry)  
  }
  return(entry[-1])
}