我正在尝试为Windows 10构建一个R软件包,该软件包将允许我在R控制台中使用PuTTY PSFTP的安全文件传输协议(SFTP)客户端将文件来回传输至SFTP服务器(是的,我知道那里还有其他软件包可以执行SFTP传输,但是我真的很想开发此软件包,使其专门用于PSFTP)。我想,如果我能克服我不知道如何在R中实现的一个障碍,就可以使它正常工作。有没有一种方法可以调用Windows系统命令并将其作为各种会话启动,因此我可以继续从R内部以交互方式使用它?我本质上只想从R控制台获取命令并将它们传递到同一Windows命令行窗口,该窗口中有一个命令在前面的命令之后执行。
一个简单的玩具示例将帮助我解释我要做什么。假设我必须逐行在R中执行多个Windows系统命令,例如使用cd ..
将目录改回一级,然后使用dir
列出目录。我可以尝试一下:
system("cmd.exe", input="cd ..")
system("cmd.exe", input="dir")
显然,这无法按我想要的方式工作,因为当我执行第二行时,在Windows系统上执行的第一行代码没有“内存”。我想要在R中使用某种方式来创建类似于上述的代码,以至于等效于我从单个cmd窗口运行命令提示符并逐个键入以下命令:
cd ..
dir
最后,我希望能够创建各种Windows会话-类似于rvest
包的工作方式。在rvest
中,用户可以创建一个会话,然后依次向该会话发送命令,随后的每个命令将从该会话中最后一个命令遗漏的位置开始:
library(rvest)
session <- html_session("http://hadley.nz")
jump_to(session, "hadley-wickham.jpg") #this continues with the session via first argument
我基本上想实现与此相同的概念,我的后续行从上一行开始。这可能吗?我将如何使用上面的“ cd ..”,“ dir”示例进行此操作?如果我能弄清楚的话,我认为我会参加比赛。
谢谢。
答案 0 :(得分:1)
尝试这样的子流程包。
library(subprocess)
handle <- spawn_process("C:\\Windows\\System32\\cmd.exe")
Sys.sleep(1)
process_read(handle, PIPE_STDOUT, timeout = 1000)
process_read(handle, PIPE_STDERR)
process_write(handle, "cd ..\n")
process_write(handle, "dir\n")
process_read(handle, PIPE_STDOUT, timeout = 1000)
process_read(handle, PIPE_STDERR)
process_write(handle, 'exit\n')
您还可以查看ps软件包和processx软件包(使用ps)。