[英]Unable to get R language system2 command result
我无法获得system2结果。 试图执行示例jar文件。
execute_system.R:
workingDir <- "C:/Code"
setwd(workingDir)
command <- "java -jar sample.jar 674"
commandResult <- system2(command, stdout="C:/Code/stdout.txt", stderr="C:/Code/stderr.txt")
cat("commandResult: ", commandResult)
我执行此execute_system.R文件并生成空文件时收到错误消息(stdout.txt,stderr.txt)
commandResult: 127
warning message: running command '"java -jar sample.jar 674"' had status 127
我想读取system2命令结果,需要处理结果数据。
当我执行相同的命令提示符时,我得到了正确的结果
C:/Code>java -jar sample.jar 123
convert from String to int...
Input: 123
Value: 123
Conversion process done!!!
实际的我的Java代码
public class Conversion{
public static void main(String args[]){
System.out.println("convert from String to int...");
String input = args[0];
System.out.println("Input: " + input );
int value = Integer.valueOf(input)
System.out.println("Value: " + value);
System.out.println("Conversion process done!!!);
}
}
我将这个java程序转换为可执行的jar文件(sample.jar)。
请帮我。 提前致谢。
这是一个容易犯的错误。
首先,让我们定义一些术语:
bash
shell使用分号(用于前台执行)或&符号(用于后台),而Windows cmd
shell使用&符号(用于前景)。 system2()
函数的设计似乎表明作者只打算用它来运行简单的命令 。 它将命令字作为第一个函数参数(预期为标量字符串,表示单元素字符向量),将命令参数作为第二个(也可以是字符向量,零个或多个元素)。 以下是文档如何将它放在这两个函数参数的描述中:
command
要调用的系统命令,作为字符串。
args
command
参数的字符向量。
以上内容并不十分清楚,但详细信息部分的第一句话有助于:
与
system()
不同,command
总是由shQuote()
引用,因此它必须是没有参数的单个命令。
正如您所看到的,文档有点模糊,因为它抛出了一般术语命令而没有做太多澄清。 他们还使用模糊的术语系统命令 ,这也无济于事。 它们的含义是第一个函数参数command
旨在成为简单命令的命令字 。 如果要传递任何命令参数 ,则必须在第二个函数参数args
指定它们。
在作者的辩护中,shell代码可能非常依赖于平台,并且在实现和行为方面不一致。 使用我在本文中定义的更精确的术语会使文档编写者面临犯错的风险,至少对于R希望支持的某些系统而言。 模糊性可以成为抵御彻底错误风险的安全措施。
请注意,这与其他R系统命令函数system()
:
command
要调用的系统命令,作为字符串。
在详细信息部分:
command
被解析为命令加上由空格分隔的参数。 因此,如果命令的路径(或单个参数,如文件路径)包含空格,则必须引用它,例如shQuote()
。 Unix-alikes将命令行传递给shell(通常是'/bin/sh
',POSIX需要shell),因此command
可以是shell认为可执行的任何东西,包括shell脚本,它可以包含多个命令,由;
分隔;
。
因此对于system()
,第一个函数参数command
是一个完整的命令行 。
所以它们实际上使用完全相同的函数参数名称( command
)和描述(“要调用的系统命令,作为字符串。”),即使参数在system()
和system2()
之间有两个完全不同的含义! 理解这个文档确实需要读者仔细解析。
所以,最后,我们可以理解如何正确使用system2()
来调用所需的java命令:
word <- 'java';
args <- c('-jar','sample.jar','674');
result <- system2(word,args,stdout='C:/Code/stdout.txt',stderr='C:/Code/stderr.txt');
只是为了进一步澄清,通过尝试一些简单的测试用例来试验这些函数的行为是有帮助的。 例如(在我的Cygwin bash shell上):
system('printf %d:%x\\\\n 31 31');
## 31:1f
system2('printf',c('%d:%x\\\\n','31','31'));
## 31:1f
(注意,反斜杠的四倍是必要的,因为它们通过3个插值上下文,即(1)R字符串文字插值,(2)bash(非单引号)词汇上下文,以及(3) printf
命令的插值第一个命令参数。我们需要printf
来插入最后的\\n
ASCII字符代码。)
此外,应该注意的是,尽管system2()
明确鼓励仅通过强制将命令字和命令参数分离为单独的函数参数来运行简单命令 ,但很有可能颠覆该意图并使用shell元字符来执行一些明确的非- 通过system2()
接口简单的shell代码:
system('echo a b; echo c d');
## a b
## c d
system2('echo',c('a','b; echo c d'));
## a b
## c d
当然,这是非常不可取的。
使用您的代码,当我执行以下操作时,它对我没有任何错误:
system2('java', args = c('-jar', 'sample.jar', '123'),
stdout = 'stdout.txt', stderr = 'stderr.txt')
我在Mac OSX 10.10.5(约塞米蒂)上运行了这个。 结果打印到“stdout.txt”。
从system2
的文档看来,第一个选项只是一个命令(即没有参数)。 参数将使用args
参数指定。
以下是详情部分的摘录:
细节
与system不同,命令总是由shQuote引用,因此它必须是没有参数的单个命令。
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.