Использование 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 дает нам две части информации:

  1. Нам нужно указать command быть исполненным и args в качестве отдельных аргументов.
  2. По умолчанию возвращаемое значение 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 На самом деле в моей системе все еще появляется сообщение: "[…] команда не найдена".

Другие вопросы по тегам