2017-06-05 4 views
0

J'utilise une commande ImageMagick sur un système OS X pour créer un panneau 2x2 composé de quatre .png chiffres que j'ai sur mon disque:R - envoyer la commande de deux lignes au système

convert \(image1.png image2.png -append \) \ 
\(image3.png image4.png -append \) +append result.png 

Lorsque collé à mon terminal, la commande ci-dessus se règle par le système, la réception d'un > au début de la deuxième ligne:

convert \(image1.png image2.png -append \) \ 
> \(image3.png image4.png -append \) +append result.png 

le chiffre obtenu ressemble à ceci:

enter image description here

Je suis en train de reproduire cette dernière commande à partir de R à l'aide des commandes suivantes:

> line1 <- paste0(" convert \\(", " img1.png img2.png -append \\)", " \\") 
> line2 <- paste0(" < \\(", " img3.png img4.png -append \\) ", "+append result.png") 
> cat(paste(line1, line2, sep='\n')) 
convert \(img1.png img2.png -append \) \ 
< \(img3.png img4.png -append \) +append result.png 

Apparemment, le résultat de cat est ce que je dois, mais je ne peux pas trouver la bonne façon pour l'envoyer au système. J'ai essayé de le combiner avec system, mais je reçois une erreur:

system(cat(paste(line1, line2, sep='\n'))) 
Error in system(cat(paste(line1, line2, sep = "\n"))) : 
    non-empty character argument expected 

La question est: comment puis-je utiliser R pour envoyer cette commande à deux lignes spécifiques au système?

+1

* a. * Vous ne devriez pas avoir besoin de l'exécuter en tant que ligne séparée sauf s'il s'agit d'une seconde commande, que vous pouvez passer lors d'un second appel. * b. * Le '\' à la fin d'une ligne de shell échappe au caractère de nouvelle ligne (qui est ignoré comme espace supplémentaire), donc si vous voulez vraiment le passer en tant que tel, ajoutez simplement un retour à la ligne (\ n) , par exemple 'system ('echo $ ((2+ \ n 3))')'. * c. * [Le paquet 'magick'] (https://ropensci.org/tutorials/magick_tutorial.html) rend tout cela un peu inutile. * d. * La meilleure façon de résoudre cela est de les tracer sur une grille en premier lieu avec 'mfrow' ou similaire. – alistaire

+0

Merci pour les suggestions @alistaire. Un conseil particulier concernant le paquet 'magick'? Je l'ai installé mais la seule chose que j'ai réussi à faire était de combiner les chiffres d'affilée ... Impossible de trouver la documentation pour m'aider à créer un panneau 'm x n' ... – thiagoveloso

Répondre

0

Basé sur les commentaires à cette question, j'ai fini par trouver la réponse. Ce code je à l'intérieur R:

system(paste0("convert \\(img1.png img2.png -append \\) \\(img3.png img4.png -append \\) +append result.png")) 
1

Dans votre commande ImageMagick retirer la nouvelle ligne \ à la fin de la première ligne et faire la commande juste une longue commande sur une seule ligne comme suit:

convert \(image1.png image2.png -append \) \(image3.png image4.png -append \) +append result.png 

Cela devrait éviter l'invite> et permettre votre commande pour passer en avant sans être dérouté par le> prompt

1

Utilisation du package magick et faire un exemple reproductible, il pourrait ressembler à

library(tidyverse) 
library(magick) 

# make and same sample images 
seq(4) %>% 
    map(~data_frame(x = seq(.x))) %>% 
    walk(~{ggplot(.x, aes(x, x)) + geom_point(); ggsave(paste0('plot', max(.x), '.svg'))}) 

# read images 
images <- image_read(paste0('plot', seq(4), '.svg')) 

# join pairs of images horizontally, then join the pairs vertically 
joined <- image_join(image_append(images[1:2]), 
        image_append(images[3:4])) %>% 
    image_append(stack = TRUE) 

# set margins 
m <- par('mar') 
par(mar = rep(0, 4)) 

# show plot 
plot(joined) 

# reset margins 
par(mar = m) 

# save plot 
image_write(joined, 'plot1234.png', format = 'png') 
+0

Merci pour cette solution. C'est un peu lent, peut-être parce que mes fichiers '.png' sont en haute résolution, mais cela fonctionne bien pour ma question. – thiagoveloso