1

我正在尝试使用 system2() 在我的 R 程序中运行已编译的 cpp 文件。cpp 的文档表明它只是一个大命令,所以我认为我不应该在 sys2 中使用 stdout 或 stder 选项。

  • 所需的 network.nodes 和 network.edges 文件位于 /files 文件夹中
  • 我可以运行 system2() 行,但它不输出任何内容
  • 我之前编译了 socialrank.cpp 并使用 Cygwin 或 cmd 提示符将其放入 /exe 文件夹中(g++ -o socialrank socialrank.cpp)

指导: - 要运行算法,只需运行:./socialrank summary_stats.txt graphname > debug.log(您需要文件 graphname.nodes 和 graphname.edges)

我的代码(如果您需要查看更多信息,请告诉我):

> nodelist %>% write_delim("./files/network.nodes", col_names = F)  
> edgelist %>% write_delim("./files/network.edges", col_names = F)
> #system("../exe/socialrank ../files/summary_stats.txt ../files/network")   #I think this code is for macs?? 
> system2("./exe/socialrank ./files/summary_stats.txt ./files/network") #Is this how you correct relative file directories for Windows?

所以没有任何东西被输出到 /files 文件夹中。我不知道 CPP 文件是否正在运行,没有导出文件,还是将它们导出到其他地方?

如果您对编译、调用 cpp 程序或 system2 函数有任何建议,请告诉我。我也听说过 sys 和 processx 包,所以不确定是否有更好的方法来调用可能跨操作系统工作的系统文件?

非常感谢你的帮助!!

4

1 回答 1

0

文档为system2我们提供了两条信息:

  1. 我们需要指定command要执行的 和args单独的参数
  2. 默认情况下, 的返回值system2是不可见的,是我们执行的命令的状态码。

第二点是您没有看到任何输出的原因。1第一点是它首先不起作用的原因:您需要单独指定命令及其参数(并且参数需要是向量):

system2('./exe/socialrank', c('./files/summary_stats.txt', './files/network'))

这假定exefiles是当前工作目录的子目录(并且相应的文件存在于这些位置)。

在您的情况下,相同的命令适用于 macOS、Windows 和 Linux。

无论如何,这与使用指南中给出的示例不太一样:

./socialrank summary_stats.txt graphname > debug.log

...因为在上面的命令中,输出没有存储在debug.log文件中,而是发送到 R 控制台。这很少有用。更常见的是,您希望将输出本身存储在 R 中的变量中。您可以通过将参数添加stdout = TRUEsystem2调用中来做到这一点。或者,指定stdout = 'debug.log'执行与上述命令相同的操作,即将输出存储在文件中。


1实际上,在我的系统上,我仍然收到一条消息:“[...] command not found”。

于 2018-06-25T14:17:35.933 回答