2012-04-02 17 views
7

Ocasionalmente encuentro que sería útil obtener la representación impresa de un objeto R como una cadena de caracteres, como la función repr de Python o el prin1-to-string de Lisp. ¿Existe tal función en R? No lo necesito para trabajar en objetos complicados o extraños, solo vectores y listas simples.¿Tiene R un equivalente de "repr" de Python (o "prin1-to-string" de Lisp)?

Editar: Quiero la cadena que tendría que escribir en la consola para generar un objeto idéntico, no la salida de print(object).

+7

Quizás esté buscando 'dput'? –

+0

La mayoría de los objetos en R tienen un método de impresión predeterminado que hace lo que está pidiendo si los llama por la línea de comando. '> x <- 1:10' '> x' – Justin

+0

@Justin, quiero decir que quiero la representación que escribiría en la consola R para construir el objeto, al igual que' repr' en Python (para objetos compatibles). –

Respuesta

16

No estoy familiarizado con las funciones de Python/Lisp que enumeró, pero creo que desea dput o .

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

Sí, dump/dput parece que hacen lo que quiero. Gracias. –

+0

Esto funcionará para objetos R simples (vectores, matrices, marcos de datos, listas de esas cosas, clases S4), pero falla para entornos y cualquier cosa con un entorno (cierres, listas con elementos de entorno) tal vez otras clases más complejas también . – Spacedman

1

Puede utilizar capture.output:

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

Para una versión sin números de línea algo en este sentido debería funcionar:

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

Simplemente use 'cat' en lugar de imprimir implícitamente el resultado. Eso debería deshacerse de los números de línea. –

+1

No quiero la salida de 'print (object)', quiero la cadena de caracteres que escribiría para crear el objeto. –

6

Ver ?evaluate en el paquete de evaluar.

EDITAR: Poster posteriormente aclaró en comentarios que quería comandos que reconstruirían el objeto en lugar de una cadena que contenía la salida print(object). En ese caso, evaluate no es lo que se busca, pero dput (como ya se mencionó en Joshua Ullrich en los comentarios y como lo publiqué se transfirió a una respuesta) y dump funcionará. recordPlot y replayPlot almacenarán y mostrarán gráficos clásicos al menos en Windows. trellis.last.object recuperará el último objeto de gráficos de celosía. También tenga en cuenta que .Last.value tiene el último valor en la consola interactiva.

1

Tenía exactamente la misma pregunta. Me preguntaba si algo estaba incorporado para esto o si necesitaría escribirlo yo mismo. No he encontrado nada incorporada así que escribí las siguientes funciones:

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)) 
} 

creo que esto hace lo que quiere. Aquí hay una prueba:

> 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 
Cuestiones relacionadas