【问题标题】:My attempt to use a "connection" while trying to read in input causes R to freeze or crash我在尝试读取输入时尝试使用“连接”导致 R 冻结或崩溃
【发布时间】:2017-12-22 19:40:19
【问题描述】:

抱歉,我在标题中使用的术语可能没有正确使用。每当我尝试运行此代码时,似乎它正在尝试运行它但从未完成该命令。当我单击停止命令符号(红色)时,它什么也不做。我无法关闭 R。那为什么要花很长时间才能运行?

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

inputs <- readLines(con)

【问题讨论】:

标签: r rstudio


【解决方案1】:

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

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

因此,如果您从终端运行 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 来终止输入)。这样做的好处是您不需要事先知道输入的行数。

【讨论】:

    【解决方案2】:

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

    要从中读取数据值的文件的名称。如果指定的文件是 "",然后从键盘(或任何 stdin() 读取的内容)获取输入 如果输入被重定向或嵌入 R)。

    如果您想考虑一个空白输入“好的”,您还可以循环从具有一些标记值的单行获取数据,即使循环停止的事物(此处为“EOF”)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2018-02-28
      相关资源
      最近更新 更多