【问题标题】:R - send two-line command to systemR - 向系统发送两行命令
【发布时间】:2017-11-05 17:53:06
【问题描述】:

我在 OS X 系统上使用 ImageMagick 命令创建一个 2x2 面板,其中包含我磁盘上的四个 .png 图形:

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

当粘贴到我的终端时,上面的命令会被系统调整,在第二行的开头收到一个>

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

生成的图形如下所示:

我正在尝试使用以下命令从 R 中重现最后一条命令:

> 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

显然,cat 的结果是我需要的,但我找不到将其发送到系统的正确方法。我尝试将其与system 结合使用,但出现错误:

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

问题是:如何使用 R 将特定的两行命令发送到系统?

【问题讨论】:

  • a. 您不需要将它作为单独的行运行,除非它是第二个命令,您可以在第二个调用中传递该命令。 b. shell 行末尾的 \ 转义换行符(作为多余的空格被忽略),所以如果你 真的 想要这样传递它,只需添加一个换行符 (\n),例如system('echo $((2+ \n 3))')c. The magick package 使这一切都变得不必要了。 d. 解决此问题的最佳方法是首先使用mfrow 或类似名称将它们绘制在网格上。
  • 感谢@alistaire 的建议。关于magick 包的任何特别提示?我安装了它,但我唯一能做的就是将这些数字连续组合起来......找不到帮助我创建 m x n 面板的文档......

标签: r command system


【解决方案1】:

在您的 ImageMagick 命令中,删除第一行末尾的新行 \,并使该命令在一行中仅包含一个长命令,如下所示:

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

这应该避免 > 提示并允许您的命令继续传递而不会被 > 提示混淆

【讨论】:

    【解决方案2】:

    根据这个问题的 cmets,我最终找到了答案。这是我在 R 中使用的代码:

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

    【讨论】:

      【解决方案3】:

      使用magick 包并制作一个可重现的示例,它可能看起来像

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

      【讨论】:

      • 感谢您的解决方案。这有点慢,可能是因为我的.png 文件是高分辨率的,但它对我的问题很有效。
      猜你喜欢
      • 2019-07-30
      • 2019-03-05
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2012-07-03
      • 2010-11-14
      相关资源
      最近更新 更多