我正在尝试使用R.NET,C#和Visual Studio为某些R脚本编写可视界面。在RStudio上执行R脚本时,它们可以正常工作。这是引起问题的代码:
#include "stdafx.h"
#include "Wave.h"
Wave::~Wave()
{
}
void Wave::setEnemyCount(int count) {
nemyCount = count;
}
bool Wave::createWave() {
for (int i = 0; i < enemyCount; i++) {
enemyArray.push_back(Enemy());
}
for (int i = 0; i < enemyArray.size(); i++) {
int randomPositionX = rand() % 150 + 10;
int randomPositionY = rand() % 50 + 10;
if (!enemyArray.at(i).init(randomPositionX, randomPositionY)) {
std::cout << "Create wave(init enemies) - failed\n";
return false;
}
}
return true;
}
void Wave::drawWave(Window* window) {
window->setCursor({ 0, 2 });
window->setColor(Window::Color::RED);
std::cout << "Enemies: " << enemyArray.size();
window->setColor(Window::Color::WHITE);
for (int i = 0; i < enemyArray.size(); i++) {
enemyArray.at(i).draw(window);
//std::cout << i;
}
}
void Wave::update(Bullet* bullet, Player* player) {
for (int i = 0; i < enemyArray.size(); i++) {
if (player->checkShoot()) {
if ((bullet->getPositionX() >= enemyArray.at(i).getPositionX() && bullet->getPositionX() <= enemyArray.at(i).getPositionX() + 5)) {
if ((bullet->getPositionY() >= enemyArray.at(i).getPositionY() && bullet->getPositionY() <= enemyArray.at(i).getPositionY() + 5)) {
player->addScore(10);
enemyArray.erase(enemyArray.begin() + i);
}
}
}
}
if (enemyArray.size() <= 0) {
std::cout << "WAVE COMPLETE";
Sleep(2000);
enemyCount += 5;
createWave();
}
}
int Wave::getEnemyCount() const {
return enemyCount;
}
某些代码可能是不必要的,我完全不了解R.NET的工作原理,并且文档也很少。该程序不会停止运行,并且我也没有收到任何异常消息,但MessageBox永远不会出现。当我逐步执行代码时,我看到该代码仅从开头到StartupParameter rinit;
private void Form1_Load(object sender, EventArgs e)
{
rinit = new StartupParameter();
rinit.Quiet = true;
rinit.RHome = "C:/Program Files/R/R-3.4.0";
rinit.Interactive = true;
REngine engine= REngine.GetInstance();
REngine.SetEnvironmentVariables(@"C:\Program Files\R\R-3.4.0\bin\i386", @"C:\Program Files\R\R-3.4.0");
engine.Evaluate("source('../../rsc/Rscripts/CargarPaquetes.r')");
engine.Evaluate("source('../../rsc/Rscripts/IntroducirDatos.r')");
engine.Evaluate("source('../../rsc/Rscripts/UnirTablas.r')");
engine.Evaluate("PorcentajeEnfermedades<- prop.table(table(TablaTotal$Enfermedad))*100");
var Porcentajes = engine.Evaluate("cbind(Frecuencia=table(TablaEntrenamiento$Enfermedad),Porcentaje=PorcentajeEnfermedades)").AsCharacter().ToArray();
MessageBox.Show(Convert.ToString(Porcentajes[0]));
engine.Dispose();
}
执行
(包括)。其余各行从不执行,我也不知道为什么。
顺便说一句,如果有人可以向我推荐R.NET的任何文档站点,我将非常感激。
----编辑----
我创建了一个按钮,并将所有这些代码移至click事件,现在程序停止并显示以下错误:
engine.Evaluate(@"source('../../rsc/Rscripts/CargarPaquetes.r')");
脚本“ CargarPaquetes.r”基本上加载一组软件包。我从R 3.5迁移到R 3.4,因为R.NET在较新的版本中出现了一些问题...现在我必须处理一些错误的已安装软件包。
尽管已解决了该问题,但发现为什么在Load事件中未调用该肽段还是很有趣的。