在 R 中使用 system2() 运行 编译的 cpp 文件
Using system2() in R to run compiled cpp file
我正在尝试使用 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 图表名称 > 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 包,所以不确定是否有更好的方法来调用可能跨操作系统工作的系统文件?
非常感谢您的帮助!!
documentation for system2
给了我们两条信息:
- 我们需要将要执行的
command
和 args
指定为 单独的参数.
- 默认情况下,
system2
的return值是不可见的,是我们执行的命令的状态码。
第二点是您没有看到任何输出的原因。1第一点是它首先不起作用的原因:您需要分别指定命令及其参数(参数必须是向量):
system2('./exe/socialrank', c('./files/summary_stats.txt', './files/network'))
这假设 exe
和 files
是当前工作目录的子目录(并且相应的文件存在于这些位置)。
在您的情况下,相同的命令适用于 macOS、Windows 和 Linux。
无论如何,这与使用指南中给出的示例不太相同:
./socialrank summary_stats.txt graphname > debug.log
… 因为在上面的命令中,输出没有存储在 debug.log
文件中,而是发送到 R 控制台。这很少有用。更常见的是,您希望将输出本身存储在 R 中的一个变量中。您可以通过将参数 stdout = TRUE
添加到 system2
调用来实现。或者,指定 stdout = 'debug.log'
执行与上述命令相同的操作,即将输出存储在文件中。
1 实际上,在我的系统上我仍然收到一条消息:“[...] command not found”。
我正在尝试使用 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 图表名称 > 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 包,所以不确定是否有更好的方法来调用可能跨操作系统工作的系统文件?
非常感谢您的帮助!!
documentation for system2
给了我们两条信息:
- 我们需要将要执行的
command
和args
指定为 单独的参数. - 默认情况下,
system2
的return值是不可见的,是我们执行的命令的状态码。
第二点是您没有看到任何输出的原因。1第一点是它首先不起作用的原因:您需要分别指定命令及其参数(参数必须是向量):
system2('./exe/socialrank', c('./files/summary_stats.txt', './files/network'))
这假设 exe
和 files
是当前工作目录的子目录(并且相应的文件存在于这些位置)。
在您的情况下,相同的命令适用于 macOS、Windows 和 Linux。
无论如何,这与使用指南中给出的示例不太相同:
./socialrank summary_stats.txt graphname > debug.log
… 因为在上面的命令中,输出没有存储在 debug.log
文件中,而是发送到 R 控制台。这很少有用。更常见的是,您希望将输出本身存储在 R 中的一个变量中。您可以通过将参数 stdout = TRUE
添加到 system2
调用来实现。或者,指定 stdout = 'debug.log'
执行与上述命令相同的操作,即将输出存储在文件中。
1 实际上,在我的系统上我仍然收到一条消息:“[...] command not found”。