抱歉,我在标题中使用的术语可能无法正确使用。每当我尝试运行此代码时,似乎它正在尝试运行它但从未完成命令。当我单击停止命令符号(红色)时,它不执行任何操作。我无法关闭R.所以为什么这会永远运行?
con <- file('stdin', open = 'r')
inputs <- readLines(con)
答案 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])
}