Использование файла .R в качестве ресурса и создание пакета непосредственно в C# - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть несколько блестящих приложений с файловой структурой global.R, ui.R, server.R и чем-то, что я называю batchTrigger.R. Содержимое последнего просто следующее:

.libPath(*Path to my R Package Repository*)
require('shiny')
runApp(*Path to the folder with the aforementioned files*)

Я создал пакетный файл с именем application.cmd со следующим кодом:

cls
@pushd ""
:::::::::::::::::::
@echo off
ECHO Loading...Please, wait. The Application will open automatically. 
ECHO --- 
ECHO Do not close this console window for the whole duration of your session 
ECHO in the application.
ECHO ---
@echo off

"C:\Program Files\R\bin\Rscript.exe" ".../**batchTrigger.R**"

:::::::::::::::::::
@popd
cmd /k

Этот пакетный файл работает просто отлично. Затем я пошел еще дальше и решил создать форму windows с несколькими приложениями R. У меня есть две кнопки в форме, каждая из которых выглядит примерно так:

1008

Пока все хорошо. Обе кнопки работают точно так, как они должны были. Я хочу go сделать еще один шаг вперед, но, поскольку я очень новичок в C#, мне нужна помощь. Я надеюсь получить динамическое местоположение c для файлов R и файлов cmd в развернутом таким образом приложении в решении. Другими словами, я должен быть в состоянии записать содержимое пакетного файла в код C#, а путь к batchTrigger.R должен быть таким, который меняется в зависимости от местоположения windows приложение формы (которое будет автономным развернутым исполняемым файлом). Идея состоит в том, что хранилище пакетов R и установка R могут оставаться в состоянии c и могут указываться batchTrigger.R и application.cmd соответственно, но местоположение самого batchTrigger.R вместе с другими файлами R перемещается вместе с приложением , Я думаю, что resource.resx может что-то с этим сделать, но как именно я могу go сделать это, я, похоже, не понимаю. Любое предложение будет высоко оценено.

1 Ответ

0 голосов
/ 15 февраля 2020

Создайте общий метод:

private void StartSilentR(string rScriptFilePath)
{
    System.Diagnostics.Process cmd = new Process();
    cmd.StartInfo.UseShellExecute = false;
    cmd.StartInfo.FileName = @"C:\Program Files\R\bin\Rscript.exe";
    cmd.StartInfo.Arguments = rScriptFilePath;
    cmd.StartInfo.CreateNoWindow = false;
    //avoid this unless you must control the app via stdin
    //cmd.StartInfo.RedirectStandardInput = true;
    cmd.Start();
}

Затем напишите что-нибудь, что вызывает его после выяснения, где находится скрипт. Например, если у вас есть структура каталогов:

RLauncherCSharpApp.exe 
rscripts\ui.R
rscripts\global.R
rscripts\batchTrigger.R

Тогда в c# вы можете:

//take exe Path, remove exe name and add rscripts folder and batchtrigger.R file name 
var rbt = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "rscripts", "batchTrigger.R");

StartSilentR(rbt);

Или, скажем, вы хотите найти все подпапки в папке приложения. ищем все файлы с именем batchTrigger.R:

var exeFolder = Path.GetDirectoryName(Application.ExecutablePath);
string[] paths = Directory.GetFiles(exeFolder, "batchTrigger.R", SearchOption.AllDirectories);

//maybe add them to a list view and the user can click one to launch ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...