Использование system2() в R для запуска скомпилированного файла cpp
Я пытаюсь запустить скомпилированный файл cpp в моей R-программе, используя system2(). Документация для cpp предполагает, что это всего лишь одна большая команда, поэтому я думаю, что я не должен использовать опции stdout или stder в sys2.
- необходимые файлы network.nodes и network.edges находятся в папке /files
- Я могу запустить строку system2 (), но она ничего не выводит
- Ранее я скомпилировал файл socialrank.cpp и поместил его в папку /exe, используя приглашение Cygwin или cmd (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, поэтому не уверен, что существует лучший способ вызова системных файлов, который, возможно, работает в разных операционных системах?
Спасибо большое за вашу помощь!!
1 ответ
Документация дляsystem2
дает нам две части информации:
- Нам нужно указать
command
быть исполненным иargs
в качестве отдельных аргументов. - По умолчанию возвращаемое значение
system2
невидим, и это код состояния команды, которую мы выполнили.
Второй момент - причина, по которой вы не видите никаких результатов.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 На самом деле в моей системе все еще появляется сообщение: "[…] команда не найдена".