2

R でシステム コマンドを実行しやすくしたいと考えています。ipython と python のようなもの。ここにいくつかの考えがあります:

  • getwd と setwd をまとめて作業ディレクトリを変更する cd 関数を定義する
  • system() コマンドをラップするオペレーターを定義して、"$ls" などを実行して system("ls") を置き換えることができるようにします。

最初のものは簡単に達成できます。しかし、私は2番目のもので立ち往生しています。R で文字列の演算子を再定義する方法が見つかりませんでした。次に、一歩下がって、sys(param) を定義しようとしました。しかし、今でも引用符を入力する必要があります。たとえば、ディレクトリを一覧表示するには、sys(ls) の代わりに sys("ls") を実行する必要があります。引用符がなくてもパラメータが文字列であると仮定する方法はありますか? ありがとう。どんな提案でも大歓迎です。

4

1 に答える 1

4

関数を簡素化 (正規表現を削除) し、文字入力のサポートを追加するために更新されました

match.callこのように引用符を使用せずに関数を呼び出すことができるように、関数内で使用できます。

sys <- function(...) {
  command <- match.call()[[2L]]
  if (!is.character(command)) {
    command <- gsub("- ", "-", deparse(command))
  }
  system(command)
}

現在、次のいずれかは同等ですsystem("ls -a")

sys("ls -a")
sys(ls -a)

上記のsys関数は、括弧内のものである呼び出しの 2 番目のコンポーネントを抽出します。すなわちls -a、または"ls -a"これらの例では。次に、それをに渡しますsystemdeparseそうでない場合は最初に通過しますcharacter

[文字列のサポートを追加しました。そうしないと、スラッシュやドットなどでは機能しないためです。たとえば、sys(ls /home)機能しませんが、sys("ls /home")機能します。]

ただし、これにはまだ括弧を使用する必要があります:-(


括弧の使用を避けるために、演算子をマスクできます。この回答の最初のバージョンで!は、良いアイデアではないマスク方法を示しました。?このように実行できるコメントで使用することを提案しました。

`?` <- function(...) {
  command <- match.call()[[2L]]
  if (!is.character(command)) {
    command <- gsub("- ", "-", deparse(command))
  }
  system(command)
} 

さて、これはsystem("ls -a -l")

?ls -a -l

ただし、スラッシュを使用する必要がある場合は、このように引用符を使用する必要があります

?"ls /home"

または、特別な二項演算子を作成することもできます

"%sys%" <- function(...) {
  system(sub("%sys%", "", deparse(match.call())))
}

こんな感じで使えます

ls %sys% -l
ls %sys% .

スラッシュを使用する必要がある場合は、右側を引用する必要があります

ls %sys% "/home"

欠点は、演算子の右側に引数が 1 つだけ必要なことです。

于 2012-08-16T17:18:57.967 に答える