2012-04-02 13 views
7

Occasionalmente trovo che sarebbe utile ottenere la rappresentazione stampata di un oggetto R come stringa di caratteri, come la funzione repr di Python o Lisp's prin1-to-string. Esiste una tale funzione in R? Non ho bisogno di lavorare su oggetti complicati o strani, solo semplici vettori e liste.R ha un equivalente di "repr" di Python (o "prin1-to-string" di Lisp)?

Modifica: voglio la stringa che dovrei digitare nella console per generare un oggetto identico, non l'output di print(object).

+7

Forse stai cercando 'dput'? –

+0

La maggior parte degli oggetti in R hanno un metodo di stampa predefinito che fa quello che stai chiedendo se li chiami semplicemente sulla riga di comando. '> x <- 1:10' '> x' – Justin

+0

@Justin, voglio dire che voglio la rappresentazione che vorrei digitare nella console R per costruire l'oggetto, proprio come' repr' fa in Python (per oggetti supportati). –

risposta

16

Non ho familiarità con le funzioni Python/Lisp che hai elencato, ma penso che tu voglia sia dput o dump.

x <- data.frame(1:10) 
dput(x) 
dump("x", file="clipboard") 
+1

Sì, dump/dput sembrano fare quello che voglio. Grazie. –

+0

Funzionerà per oggetti R semplici (vettori, matrici, frame di dati, elenchi di tali elementi, classi S4), ma non riesce per gli ambienti e qualsiasi cosa con un ambiente (chiusure, elenchi con elementi di ambiente) forse anche altre classi più complesse . – Spacedman

1

È possibile utilizzare capture.output:

repr <- function(x) { 
    paste(sprintf('%s\n', capture.output(show(x))), collapse='') 
} 

Per una versione senza il numeri di riga qualcosa in questo senso dovrebbe funzionare:

repr <- function(x) { 
    cat(sprintf('%s\n', capture.output(show(x))), collapse='') 
} 
+0

Basta usare 'cat' invece di stampare implicitamente il risultato. Questo dovrebbe sbarazzarsi dei numeri di linea. –

+1

Non voglio l'output di 'print (oggetto)', voglio la stringa di caratteri che vorrei digitare per creare l'oggetto. –

6

Vedi ?evaluate nel pacchetto valutare.

MODIFICA: Poster in seguito ha chiarito nei commenti che desiderava i comandi che avrebbero ricostruito l'oggetto anziché una stringa che conteneva l'output . In tal caso, evaluate non è ciò che si desidera ma è dput (come già menzionato da Joshua Ullrich nei commenti e da quando ho postato è stato trasferito a una risposta) e dump funzionerà. recordPlot e replayPlot memorizzeranno e sostituiranno la grafica classica almeno su Windows. trellis.last.object recupererà l'ultimo oggetto grafico reticolo. Si noti inoltre che .Last.value contiene l'ultimo valore nella console interattiva.

1

Ho avuto esattamente la stessa domanda. Mi stavo chiedendo se qualcosa fosse stato incorporato per questo o se avessi avuto bisogno di scriverlo da solo. Non ho trovato nulla di built-in così ho scritto le seguenti funzioni:

dputToString <- function (obj) { 
    con <- textConnection(NULL,open="w") 
    tryCatch({dput(obj,con); 
      textConnectionValue(con)}, 
      finally=close(con)) 
} 

dgetFromString <- function (str) { 
    con <- textConnection(str,open="r") 
    tryCatch(dget(con), finally=close(con)) 
} 

Penso che questo faccia quello che vuoi. Ecco un test:

> rep <- dputToString(matrix(1:10,2,5)) 
> rep 
[1] "structure(1:10, .Dim = c(2L, 5L))" 
> mat <- dgetFromString(rep) 
> mat 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 3 5 7 9 
[2,] 2 4 6 8 10