2011-02-05 3 views
4

Rの初心者ですが、簡単な問題のように思えますが、Rで評価する方法や時期についてはかなり深い疑問があります。未評価のコマンドをRの関数に渡す

私はRserveをかなり使用しています。

RSeval(connection, quote(try(command))) 

は、だから私はちょうど呼び出しで同じことをする関数rたい:リモートに評価され、物事を取得するための一般的な構文は、痛みのビットを繰り返し入力することです

r(command) 

をマイまず、ナイーブは、関与の試みが失敗にバインド:

r <- function(command) { 
    RSeval(c, quote(try(command))) 
} 

をあなたはそれを推測しました:これは、文字通り、私の混乱しRserveデーモンへtry(command)を送信します。私はcommandと部分的にと評価します。つまり、引数として入力したものに置き換えられますが、ではなく、がローカルで評価されます。

私はこれに対する解決策を探して、見積もり、代替、評価、呼び出しなどのドキュメントを閲覧しましたが、うまくいくものを見つけることができませんでした。 commandがローカルで評価されるか、まったく評価されません。

これは大きな問題ではありません、私はすべての時間を入力することができますquote(try())事;しかし、この時点で、私はこれをうまく動作させる方法について、ほとんど興味があります!

EDIT: 私が何をしたいかについてもっと説明します。

  • 上記のテキストでは、commandは機能を呼び出すためのもので、理想的には文字列ではありません。 "a<-3"またはquote(a<-3)ではなく、a <- 3またはassign("a", 3)のようなものです。 私はこれがこのトリッキーなことの一部であると信じています。 Rにこれをローカルで評価しないように指示するのは本当に難しいようですが、それを文字通り送信するだけです。基本的には、私の関数はquote()のように、その引数を評価しないようにしたいと思います。
  • 私の意図についての説明。リモートRデーモンにコマンドを渡すために、Rserveを頻繁に使用したいと考えています。コマンドは私自身(または私の同僚)で、ファイアウォールと認証で保護されたデーモン(ルートとしては実行されません)です。したがって、悪意のあるコマンドが渡される心配はありません。
  • 正直言って、これは大きな問題ではありません。私は常にRSeval(c, quote(try()))を使用してとてもうれしいです。この時点で、これはRのサブタイトルへの興味深い問い合わせのようなものです:-)
+2

Rの評価を制御する方法とその中​​のいくつかの落とし穴を説明しようとしています。https://github.com/hadley/devtools/wiki/Evaluation – hadley

+0

このリンクは現在死んでいます。 –

答えて

4

あなたはおそらく代理コマンドを使用したいと思うかもしれません、それはあなたが呼び出しに組み込むことができる引数が評価されていないことをあなたに与えるかもしれません。

+1

あなたは正しいです。私は私の質問を投稿する前にこれを試したと確信していたが、明らかにそうではなかった!このコードは私が望んだことを行います: 'r < - function(command)RSeval(c、substitute(command))' ありがとうございました。私はそれを鳴らしたよりも簡単でした! – crayola

0

私はあなたを正しく理解しているかわかりません - eval(parse(text = command))はこのトリックを行いますか? commandは文字なので、簡単に関数の引数として渡すことができます。 私はポイントを得ています...

とにかく、ユーザー指定のコマンドを評価すると悪意のある可能性があるため、お勧めしません。あなたはAppArmorをインストールしてそれを調整するか(簡単なものではない)、または評価の全体をドロップする必要があります...

+0

こんにちは、返信ありがとうございます。残念ながら私の説明では私は少し不明だったと思う。最初の質問に編集を追加してあいまいさを減らします。 – crayola

+1

'parse(text = command)'は、コマンドを文字列にする必要があるので、このトリックは行いません。 'command'を評価せずに文字列にする方法が見つからない限り、 'as.character'と' deparse'のどちらもこの法案に適合していないようです。 – crayola