解决R中system2调用带终端输入的FORTRAN编译可执行文件失效问题
解决R中调用带输入重定向的Fortran可执行文件问题
我之前也遇到过类似的情况——直接在终端里用<重定向输入没问题,但用system2就卡壳了。这是因为system2的设计逻辑和终端shell不一样,它不会自动解析命令里的重定向符号,得换个方式处理,这里有两个靠谱的解决方案:
方法1:用system2的stdin参数指定输入文件
这是最推荐的方式,符合system2的设计规范,跨平台兼容性也更好:
# 直接将输入文件传给stdin参数 system2("pm.exe", stdin = "pm.resp")
这样R会自动把pm.resp的内容作为pm.exe的输入,和终端里的pm.exe < pm.resp效果完全一致。
方法2:用system函数调用shell解析重定向
如果你更习惯终端的写法,也可以用基础的system函数,让它通过系统shell来执行完整的命令:
# 让shell处理重定向符号 system("pm.exe < pm.resp", intern = FALSE)
intern=FALSE是默认值,它表示不捕获程序的输出,让程序按正常流程生成输出文件。
额外注意事项
- 路径要准确:如果
pm.exe或pm.resp不在当前工作目录,一定要用绝对路径,比如用file.path(getwd(), "pm.resp")生成正确的路径,避免因为找不到文件导致失败。 - 权限检查:确保R有读取
pm.resp和执行pm.exe的权限,Windows下如果程序需要管理员权限,记得右键以管理员身份运行R。 - 排查错误:如果还是不行,可以捕获错误信息来定位问题:
# 将错误信息写入日志文件 system2("pm.exe", stdin = "pm.resp", stderr = "pm_error.log") # 或者直接在控制台显示错误 system2("pm.exe", stdin = "pm.resp", stderr = "")
内容的提问来源于stack exchange,提问作者rjss
相关产品推荐
相关产品推荐

