我想使用R(系统)命令调用.exe程序(spi_sl_6.exe),但是我无法使用“system”将参数输入到程序中。跟随是我的命令和参数:system("D:\\working\spi_sl_6.exe")
我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一点的想法。提前谢谢。
答案 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.dat
和out2.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)