2017-12-22 7 views
4

申し訳ありませんが、タイトルで使用する用語は正しく使用されていない可能性があります。このコードを実行しようとすると、実行しようとしているが、コマンドを完了することはないようです。停止コマンドの記号(赤)をクリックすると、何もしません。私はRから近づくことができません。なぜこれは永遠に走るのですか? RStudioで作業する場合入力を読み込もうとしているときに「接続」を使用しようとすると、フリーズまたはクラッシュが発生する

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

inputs <- readLines(con) 
+1

これが関係している可能性がある 'readLines(STDIN())' –

+1

をお試しください:https://stackoverflow.com/questions/30191232/use-stdin-from-within-r-studio – InfiniteFlashChess

+0

@RADO、私は」あなたが受け入れる答えに賞金を授与します。 – InfiniteFlashChess

答えて

5

、あなたはターミナルでRを実行している場合のいずれかを使用できますが、むしろreadLines(file('stdin'))よりreadLines(stdin())を使用する必要があります。

ただし、RStudioを使用しているため、入力行数を指定しないという問題もあります。入力を標準入力から読み取るときは、と入力します。 + Dは入力の終了を知らせます。しかし、端末Ctrl+D is unavailableからではなくRStudioからこれを行う場合は、入力行を指定せずに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" 

代替回避策は、(私は入力を終了するを入力押下3行目)、例えば:

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

scan()を使用することです。利点は、事前に入力行の数を知る必要はないということです。

1

RStudioはRと幾分間接的に接続しています(少なくとも4 years agoはstdinをどこにもリダイレクトしません)。おそらく、私たちの目的のために埋め込まれています。これはおそらく、なぜstdin()がreadLines(ファイル接続ではなく端末接続を作成する)と組み合わされて動作するのかの一部です。 @ duckmayrのscan()ソリューションは

...からのデータ値を読み込むためのファイルの名前は非常にいいですし、このような状況で働くものの一種であることを文書化されています。指定されたファイルが ""の場合、入力がリダイレクトされるか、またはRが埋め込まれている場合、キーボードから入力が取得されます(またはstdin()は となります)。

ブランク入力を「大丈夫」と考えたい場合は、ループを止める値(ここでは「EOF」)を使用して、1行のデータをループバックすることもできます。

input <- function() { 
    entry <- '' 
    while (!any(entry == "EOF")) { 
    entry <- c(readline(), entry) 
    } 
    return(entry[-1]) 
} 
関連する問題