2009-10-23 6 views
2

Existe-t-il un moyen d'avoir un périphérique R (le post-scriptum serait génial) écrire la sortie dans une variable au lieu d'un fichier?Écrire le texte du tracé/binaire dans la variable

Par exemple, je sais que cela:

postscript(file="|cat") 
plot(1:10) 
dev.off() 

Prêt à envoyer le texte à postscript STDOUT. Comment puis-je obtenir ce texte dans une variable au sein de R?

Répondre

3

J'ai réussi à obtenir le binaire d'un tracé dans une variable R sous la forme d'une chaîne. Il y a des frais généraux de lecture/écriture. Dans l'extrait ci-dessous, R enregistre le tracé en tant que fichier temporaire et il relit.

## create a plot 
x <- rnorm(100,0,1) 
hist(x, col="light blue") 

## save plot as temp file 
png(filename="temp.png", width=500, height=500) 
print(p) 
dev.off() 

## read temp file as a binary string 
plot_binary <- paste(readBin("temp.png", what="raw", n=1e6), collapse="") 

Peut-être que cela est utile pour vous.

+0

Je ne sais pas comment j'ai raté cette réponse. Merci stotastic, frais généraux et fichier tmp mis à part, c'est probablement le seul moyen ... :( – Mark

1

postscript prend un argument de commande, d'où postscript (file = "", command = "| cat")

+0

@Jeff, c'est en fait postscript (file = "", command = "cat") (pas de pipe), mais ça fait la même chose que je décris ci-dessus, placez-le sur STDOUT. J'aimerais que ce contenu soit écrit dans une variable de la session R. – Mark

+0

Désolé combat ça. Je ne devrais pas seulement faire attention à moitié. – Jeff

1

Pourquoi diable voudriez-vous faire? R n'est pas un très bon système pour manipuler des fichiers Postscript. Si rien d'autre, vous pouvez utiliser tempfile() pour écrire l'image dans un fichier, que vous pouvez ensuite lire en utilisant les fonctions de fichiers standard. Si vous vouliez être chic, vous pourriez peut-être utiliser fifo() pipes, mais je doute que ce soit beaucoup plus rapide. Mais je soupçonne que vous feriez mieux d'adopter une approche différente.

+1

@ Harlan, la raison est quelque peu alambiquée. J'utilise rpy2 pour interagir avec R dans une application web python. Je voudrais profiter d'une fonction de traçage écrite en R, transmettre les données avec rpy2, puis les transmettre au navigateur. Juste curieux si je pouvais faire la routine entière sans avoir recours aux fichiers temporaires. – Mark

+0

OK, dans ce cas, je suis sûr que vous voulez utiliser une connexion fifo() entre le processus R et le processus python. Si les fifos sont nouveaux pour vous, vous pouvez vouloir prendre un livre sur la programmation POSIX. – Harlan

+1

Une autre pensée - vous semblez être sur un unix-même. Si je me souviens bien, les systèmes de fichiers UNIX sont extrêmement efficaces si l'on suppose qu'ils sont configurés avec des caches RAM relativement grands. Le système d'exploitation (et ses dérivés) a été conçu pour créer et utiliser des fichiers temporaires de manière intensive. Il peut en effet être le plus simple et le plus simple d'utiliser simplement des fichiers temporaires. Essayez-le. Je serais curieux de savoir si le fichier temporaire était en fait le lien le plus lent de la chaîne. J'en doute. – Harlan

0

Vous devriez pouvoir utiliser un textConnection comme suit.

tc <- textConnection("string", "w") 

postscript(tc) 
plot(1:10) 
dev.off() 

Mais string reste vide - peut-être un bug?

+0

Impossible de faire. PostScript prend un vecteur de caractères définissant un nom de fichier ou un format de nom de fichier. Pas de connexions. C'est la raison pour laquelle je suis venu avec le correctif R Connections: pour diffuser des graphiques à une connexion. – Jeff

+0

@Jeff, si elle ne va pas diffuser vers n'importe quelle connexion, cela signifie-t-il aussi que les fifos de Harlan ci-dessus sont un non-go? – Mark

Questions connexes