当R脚本是自动化的时候会产生不同

以下命令在pdf文件上执行ghostscript。 ( pdf_filevariables包含该pdf的path)

 bbox <- system(paste( "C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH -f", pdf_file, "2>&1" ), intern=TRUE) 

执行后bbox包含以下string。

 GPL Ghostscript 8.64 (2009-02-03) Copyright (C) 2009 Artifex Software, Inc. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Processing pages 1 through 1. Page 1 %%BoundingBox: 36 2544 248 2825 %%HiResBoundingBox: 36.395015 2544.659922 247.070032 2824.685914 Error: /undefinedfilename in (2>&1) Operand stack: Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push Dictionary stack: --dict:1147/1684(ro)(G)-- --dict:1/20(G)-- --dict:69/200(L)-- Current allocation mode is local Last OS error: No such file or directory GPL Ghostscript 8.64: Unrecoverable error, exit code 1 

然后这个string被操纵,以便边界框尺寸(36 2544 248 2825)被隔离,并用于裁剪PDF文件。 到目前为止一切正常。

但是,当我在任务pipe理器(使用Rscript.exe或Rcmd.exe BATCH)中安排此脚本时,或者当脚本位于R块内时,我按下knit HTML ,bbox将获得以下string,它缺lessBoundingBox信息使其无法使用:

 GPL Ghostscript 8.64 (2009-02-03) Copyright (C) 2009 Artifex Software, Inc. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Processing pages 1 through 1. Page 1 Error: /undefinedfilename in (2>&1) Operand stack: Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push Dictionary stack: --dict:1147/1684(ro)(G)-- --dict:1/20(G)-- --dict:69/200(L)-- Current allocation mode is local Last OS error: No such file or directory 

我怎样才能克服这个问题,并使脚本自动运行?

(脚本来自对这个问题的接受答案)

Solutions Collecting From Web of "当R脚本是自动化的时候会产生不同"

你在命令结尾添加的2>&1被发送到ghostscript解释器,而不是shell。 Ghostscript将其解释为一个文件 ,因此是错误的。 我用procmon来看看创建过程:

stderr重定向被ghostscript视为一个文件

为了让shell解释它,你必须在命令前加上cmd /c ,像这样

 > bbox <- system(paste("cmd /c C:/Progra~1/gs/gs9.07/bin/gswin64c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH -q -f",pdf_file,"2>&1"), intern=TRUE) > print (bbox) [1] "%%BoundingBox: 28 37 584 691" "%%HiResBoundingBox: 28.997999 37.511999 583.991982 690.839979" 

该设备的输出将stdout,错误将进一步stderr。 在终端,这些显然都被送到终端显示在一起,在第二种情况下,他们显然不是和标准输出失踪。

这并不令人感到意外,因为你在(2>&1)上收到错误信息。 这看起来像是将stdout重定向到一个文件,但有两个问题。 首先,您没有为要发送的输出提供文件名,其次,您没有在命令shell中运行,所以命令处理器不执行重定向。

我对R一无所知,所以我不能告诉你怎么做,但是你应该先从命令行中删除'2>&1'。 您也可以考虑使用不到4年的Ghostscript版本。 目前的版本是9.07,刚刚发布。

尝试这个。

使用环境变量设置输出文件

然后使用%envvar%符号,基于上面的链接将是%TODAY%这将被替换为文件名星期五。 -f不是必须的,但不应该伤害。 如果要路由输出,请设置第二个env变量并路由它>%outenv%。

这样你可以做一个简单的系统调用(参见使用变量而不是固定字符串的链接),

 Sys.setenv(envvar= "pdf.file") Sys.setenv(outenv= "out.file") "C:/gs/gs8.64/bin/gswin32c.exe -sDEVICE=bbox -dNOPAUSE -dBATCH %envvar% >%outenv%"