Использование system2 () в R для запуска скомпилированного файла cpp - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь запустить скомпилированный файл cpp в моей R-программе, используя system2 ().Документация для cpp предполагает, что это всего лишь одна большая команда, поэтому я думаю, что я не должен использовать опции stdout или stder в sys2.

  • необходимые network.nodes и network.Файлы ребер находятся в папке / files
  • Я могу запустить строку system2 (), но она ничего не выводит
  • Я предварительно скомпилировал файл socialrank.cpp и поместил его в / exeпапка, используя приглашение Cygwin или cmd (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?

Так что ничего не выводится в / файлыпапка.Я не могу сказать, запускается ли файл CPP, не экспортируется ли файл или экспортируется ли он в другое место?

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения по компиляции, вызову программ cpp или функции system2.Я также слышал о пакетах sys и processx, поэтому не уверен, существует ли лучший способ вызова системных файлов, который, возможно, работает в разных операционных системах?

Большое спасибо за помощь !!

1 Ответ

0 голосов
/ 25 июня 2018

Документация для 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 На самом деле в моей системе все еще появляется сообщение: «[…] команда не найдена».

...