2012-06-02 14 views
16

おそらく私はこれを想像しているかもしれませんが、Rのベクトル(およびおそらく行列のような他のオブジェクトおよびデータフレーム)を、そのオブジェクトを入力するために使用する形式(文字列として返されます)で入力します。例:RのベクトルをRに入力するのと同じ形式で出力するR

> x <- c(1,2,3) 
> x 
[1] 1 2 3 
> magical.function(x) 
"c(1,2,3)" 

この機能はありますか?

+0

'deparse(x)'を見てください。 –

答えて

22

dput多分?

> test <- c(1,2,3) 
> dput(test) 
c(1, 2, 3) 

あなたはまた、作業ディレクトリに書き込まれたファイルに一度に複数のオブジェクトをdumpことができます。

> test2 <- matrix(1:10,nrow=2) 
> test2 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10 
> dump(c("test","test2")) 

dumpdata.rが、その後含まれています:

test <- 
c(1, 2, 3) 
test2 <- 
structure(1:10, .Dim = c(2L, 5L)) 
1

私がすることにしましたdput()が私がやろうとしていたもののために働いていないことがわかったので、この解決策を追加してください。私はshinyアプリを持っていて、ユーザーセッションに基づいてレポートを作成するのにknitrを使用しています。私は、.Rmdをレンダリングする前にknit_expand()を使用して、光沢のあるセッションのユーザーパラメータを.Rmdに移植します。

あまりにも詳細なことはしませんが、誰かが実行する.Rmdのコード行に書き込まれるため、私は "そのまま"のコードを移植する必要があります。この場合、dput()は出力がコンソールに溜まり、dump()メソッドが機能するため動作しませんでしたが、毎回新しいファイルを書き込んで削除したくありませんでした。

もっと良い方法があるかもしれませんが、 "そのまま"の文字オブジェクトを返す関数を書いています。これは、数値ベクトルと文字ベクトルの両方を扱います(文字ベクトルの各要素の周りに引用符を投げます)。また、単一の入力を処理し、そのままそのまま返します。それはかなりではありません。私はそれを書くためのより効率的な方法があると確信していますが、私のニーズに完全に対応しています。私はこの解決策を争いに加えるつもりだと思った。

printVecAsis <- function(x) { 
    ifelse(length(x) == 1, x, 
     ifelse(is.character(x), paste0("c(", paste(sapply(x, function(a) paste0("\'",a,"\'")), collapse=", "), ")"), 
       paste0("c(", paste(x, collapse=", "), ")")))}