2013-05-24 13 views
7

ソケット接続に関しては完全に初心者ですが、Rでそれらを使用する方法を学ぼうとしています。 "接続"のRドキュメントの例に従おうとしています。R - socketConnection

con1 <- socketConnection(port = 6011, server = TRUE) 

アプリケーションは、私が出て取得するには、停止ボタンを押す必要が無限ループに入り、:Rstudioで次のコマンドを実行すると

しかし、(R 3.0を実行しています)。結果として、私は、誰かが私が間違っているのものにいくつかの光を当てることができます例

writeLines(LETTERS, con1) 
close(con1) 

の次の行に続けることができませんか?

答えて

5

実行しようとしている例では、2つのRプロセスが必要です。あなたが別のプロセスが同じポートを指定して、それに接続するまで(あなたが見てきたように)ブロックされますを示しコード:仕事にこのコードを、あなたが同じマシン上でそれを実行しなければならないこと

con2 <- socketConnection(Sys.info()["nodename"], port = 6011) 

注意最初のプロセス、それ以外の場合はエラーが発生します。 2番目のプロセスが実行されると、最初のプロセスはブロックを返し、socketConnectionオブジェクトを返し、2番目のプロセスで読み取ることができるデータを書き込みます。

socketConnectionのマニュアルページの例は、example(socketConnection)を実行すると実行されないことに注意してください。そうだった場合は、あなたが見たようにRセッションをハングアップします。

2

ララ、私はまた、あなたがソケットに完全に知られていないものとしてやろうとしていることをしようとしています。 #R freenodeチャットルーム私に適切なアドバイスを与えた:telnetを使用してください。


ので、ターミナルウィンドウ1:

Rは、(それに話をするために誰かを待っている)今ハングする必要があります。

は今、別のターミナルウィンドウと型を開く:

telnet localhost 12345 

はあなたがRがぶら下がっもはや見られないだろうバックウィンドウ1に移動します。良い!だから今(同じウィンドウ1)タイプ:窓2に

readChar(s,3) 

戻り、telnetウィンドウ。タイプ:あなたは、ウィンドウ1に表示されますどのような

Lalas wins at life. 

は、ウィンドウ1の境界を越えどこかに入っているテキストで、入ってきたので、

Lal 

は残念ながらreadCharは短いメッセージを期待していた1窓、あなたはすべてを手に入れませんでした。もう一度とお試しください。

as win 

となります。readChar(s,1)は「そこにぶら下がっている」ような文字を聞いていることがわかります(どこに?)。奇妙な。しかし、これはメッセージの長さをあらかじめ指定しなければならないので、聞く迷惑な方法です。


try readLines(s)この仕様を必要としません。 EOL文字を待ちます。その後、

Money 
that's what I want 
that's what I waaaaaaaant 

私はreadLines(s)は私を聞くために得ることを理解することができる唯一の方法は、Ctrlキーによりだった]「プロンプトを取得するためにtelnetにすると:

戻るウィンドウ2に、Telnetウィンドウclose ing。今これはでernstからより多くの助けを使用している1


Rは(あなたが\r\nなどを入力した場合でも)、これらすべての改行を聞くことはありませんが、接続がクローズされたら、ウィンドウ内の各ラインを取得します同じfreenodeルーム。今回はtelnetを使用する代わりにnc localhost 12345を使用しました。 Netcatは聞き取り、話すことができ、私はEOLCtrlDと送ることができます。

ウィンドウ1のソケット接続を閉じてもう一度開きます。s = socketConnection(port=12345,server=T)。ウィンドウ2でtelnetを閉じ、代わりにnc localhost 12345と入力します。今すぐ両側にメッセージを入力すると、それらを互いに受け取ることができます。

ウィンドウ1:

cat(rpois(1e2, 20), file=s) 
readLines(s) 

は、ウィンドウ2(すでにいくつかのランダムな数字を聞いたことがあるはずです):

Lalas 
wins 
at 
life. 
{{control D}} 

窓1は現在のメッセージを受け取っているはずです。