Произошло необработанное исключение типа "System.StackruException" в RDotNet.dll для загрузки библиотеки R в веб-приложении.
Я получаю сообщение об ошибке при загрузке библиотеки "dplyr".
engine.Evaluate("library(dplyr)");
Выше кода мне та же ошибка
"Произошло необработанное исключение типа" System.StackruException "в RDotNet.dll".
Может кто-нибудь, пожалуйста, помогите мне? Заранее спасибо...
2 ответа
У меня была похожая проблема с загрузкой dplyr и других библиотек R. Оказывается, проблема заключается в том, что IIS и IIS Express имеют размер стека 256 КБ в 32-разрядной системе и 512 К в 64-разрядной ОС, как упомянуто здесь. Вы можете обойти это, либо:
1) Создание потока с большим размером стека и выполнение команд R.NET внутри него. Например:
Thread t = new Thread(MyMethodToDoRWork, 2500000 /*thread stack size of 2.5MB*/);
2) Измените размер стека по умолчанию для процесса IIS или IIS Express с помощью инструмента EditBin (поставляется с Visual Studio). Смотрите пример здесь. Однако я не рекомендую это делать, так как вы будете изменять реальный двоичный файл IIS/IIS Express.
Я решил проблему сбоя, добавив весь код R в новый поток. Он работает отлично. В режиме отладки я даже вижу, что код R оценивается правильно! Код ниже (он на VB, но его легко преобразовать в C#). Кроме того, я добавил еще немного контекста, который может помочь.
Загвоздка в том, что теперь, когда мы находимся в другом потоке, я не могу получить доступ к потоку пользовательского интерфейса. Кажется, есть отличный способ сделать это в Win Forms, используя метод Invoke пользовательского интерфейса, но веб-элементы управления, похоже, не имеют этого метода. Надеюсь, это поможет некоторым.
Public Class SPF_R
Inherits System.Web.UI.Page
Dim t As System.Threading.Thread
...
Private Sub RunRStuff()
Dim RCode As String = ""
Dim engine As REngine = REngine.GetInstance(Nothing, True, Nothing)
Dim myPath As String = ViewState("Folder") & ViewState("File")
engine.Initialize()
engine.Evaluate("library(MASS)") : RCode &= "library(MASS)" & vbCrLf
engine.Evaluate("library(ggplot2)") : RCode &= "library(ggplot)" & vbCrLf
engine.Evaluate("library(broom)") : RCode &= "library(broom)" & vbCrLf
...
End Sub
Private Function DevelopSPF() As Boolean
cmdSPF.Enabled = False
t = New System.Threading.Thread(AddressOf RunRStuff, 2500000)
t.Start()
cmdSPF.Enabled = True
Return True
End Function
...