0

svSocketサーバーで一般的な式を実行しようとしているパッケージで

expr <- "demo<-new.env()"
evalServer(con, expr, expr)
> evalServer(con, parse(text=expr))
Error in source(objcon, local = TRUE, echo = FALSE, verbose = FALSE) : 
  objcon:1:65: unexpected '<'
1: ..Last.value <-structure(expression(demo<-new.env()), srcfile = <

どうすればそれを回避できますか? PS: 私の必要性は、サーバーにオブジェクトをプログラムで作成することです。たとえばdemo、ユーザー入力から来て、上記の文字列に paste()d します。

再現可能な例 ### 2 つのセッションを開く

# run in the 1st rsession
require(svSocket)
startSocketServer()

# run in the 2nd rsession
con <- socketConnection(host = "localhost", port = 8888, blocking = FALSE)
expr <- "demo<-new.env()"
evalServer(con, expr, expr)
4

1 に答える 1

1

ここにあなたがしたいことの回避策があります。

まず、ターミナル ウィンドウでソケット サーバーを使用して R を起動します。

$ R
> require(svSocket)
> startSocketServer()
> 

次に、別の R プロセスで svSocket をロードし、ソケット サーバーに接続して以下を使用しますevalServer()

$ R
> require(svSocket)
> options(prompt = "RClient> ")
RClient> con <- socketConnection(host = "localhost", port = 8888, blocking = FALSE)

現在、evalServer()ソケットを介して送信するために、R オブジェクトをシリアライズ/デシリアライズすることによって機能します。すべての R オブジェクトがシリアル化できるわけではありません…そして、環境は問題を引き起こすオブジェクトの 1 つです。

やりたいことを実行することは可能ですが、環境オブジェクトがクライアントからサーバーに渡されないように注意する必要があります。これを行う 1 つの方法は、指示をテキスト文字列として送信することです (環境を返さないようにします)。

RClient> evalServer(con, expr, "demo <- new.env(); NULL")

次に、サーバー側でそのコードを解析して評価するようにサーバーに指示する必要があります。クライアントから:

RClient> evalServer(con, eval(parse(text = expr)))

デモ オブジェクトがサーバーで作成され、クライアント内から適切なクラスであることを確認できます (ここでは、オブジェクトはシリアル化可能であるため、問題はありません)。

RClient> evalServer(con, ls())
[1] "demo" "expr"
RClient> evalServer(con, class(demo))
[1] "environment"
RClient> 

そしてもちろん、クライアントから「demo」を操作するときも注意が必要です。最後に忘れないでください:

RClient> close(con)
于 2013-11-08T13:06:52.200 に答える