如何使用R调用exe程序和输入参数?

时间:2017-07-19 18:24:26

标签: r parameters exe

我想使用R(系统)命令调用.exe程序(spi_sl_6.exe),但是我无法使用“system”将参数输入到程序中。跟随是我的命令和参数:system("D:\\working\spi_sl_6.exe")

https://i.stack.imgur.com/I6Try.jpg 我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一点的想法。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用sprintf构建命令:

cmd_name <- "D:\\working\spi_sl_6.exe"
param1 <- "a"
param2 <- "b"
system2(sprintf("%s %s %s",cmd_name,param1,param2))

或者使用system2(我更喜欢这个选项):

system2(cmd_name, args = c(param1,param2))

答案 1 :(得分:1)

这是使用标准化降水指数软件 http://drought.unl.edu/MonitoringTools/DownloadableSPIProgram.aspx

这似乎提供了一个使用Windows的工作解决方案(但不是没有警告!)

Fisrt下载软件和示例文件

# Create directory to download software
mydir <- "C:\\Users\\david\\spi"
dir.create(mydir)

url <- "http://drought.unl.edu/archive/Programs/SPI"
download.file(file.path(url, "spi_sl_6.exe"), file.path(mydir, "spi_sl_6.exe"), mode="wb")

# Download example files
download.file(file.path(url, "SPI_samplefiles.zip"), file.path(mydir, "SPI_samplefiles.zip"))
# extract one example file, and write out
temp <- unzip(file.path(mydir, "SPI_samplefiles.zip"), "wymo.cor")
dat <- read.table(temp)
# Use this file as an example input
write.table(dat, file.path(mydir,"wymo.cor"), col.names = FALSE, row.names = FALSE)

在上述链接的帮助文件 basic-spi-program-information.pdf 的第3页,命令行代码的格式应为spi 3 6 12 <infile.dat >outfile.dat,但是, 以下两者都不起作用(仅来自命令行而不是R),以及如何传递参数的各种迭代。

C:\Users\david\spi\spi_sl_6 3 <C:\Users\david\spi\wymo.cor >C:\Users\david\spi\out.dat
cd C:\Users\david\spi && spi_sl_6 3 <wymo.cor >out.dat

但是,使用Running .exe file with multiple parameters in c#中接受的答案 似乎工作。这又来自命令行

cd C:\Users\david\spi && (echo 2 && echo 3 && echo 6 && echo wymo.cor && echo out1.dat) | spi_sl_6 

所以要在R中运行它,你可以将它包装在shell中(你需要改变你保存exe的地方的路径)

shell("cd C:\\Users\\david\\spi && (echo 2 && echo 3 && echo 6 && echo wymo.cor && echo out2.dat) | spi_sl_6", intern=TRUE)

out1.datout2.dat应该相同。

这会抛出警告消息,我想从echo(在R中但不是从命令行)但是生成了输出文件。

假设您可以轻松地自动化所有回声调用,所以您需要做的就是输入时间参数。

timez <- c(2, 3, 6)
stime <- paste("echo", timez, collapse =" && ")
infile <- "wymo.cor"
outfile <- "out3.dat"
spiCall <- paste("cd", mydir, "&& (" , stime, "&& echo", infile, "&& echo", outfile, " ) | spi_sl_6")
shell(spiCall)