网站后台管理功能,wordpress heart,浙江响应式网站建设制作,织梦帝国和wordpress这是将近二年前#xff0c;有一个项目使用.NET相关技术#xff0c;但是项目中要将写好的R语言的代码#xff0c;直接通过.NET调用#xff0c;得到计算结果#xff0c;遇到了这么多的坑#xff0c;在此记下一些过程#xff0c;文档太少#xff0c;英文不好#xff01;有一个项目使用.NET相关技术但是项目中要将写好的R语言的代码直接通过.NET调用得到计算结果遇到了这么多的坑在此记下一些过程文档太少英文不好如下为开发过程中可能出现的问题相关博客介绍使用的类库是 RDotNet ,开源地址R.NET他有官网的对R.NET的一些介绍 这个可能需要翻墙。我找了很多博客在CSDN上的代码基本都是重复的也没有太多的介绍一般情况都是官网直接翻译下来的遇到一些问题时根本查不到是什么原因。那么遇到问题怎么办1、看官网里面有一些示例的链接这个相当于示例代码库2、看github上开源地址的Issue看不懂英语也要看有些问题看完你就会懂了。R.NET是什么我的理解R语言就像是SQL语言用于数据计算数据处理。R.Net这个类库就类似ADO.NET的技术帮助我们实现.NET程序访问R语言代码R.NET就相当于一个驱动程序。当然严格意义上我也不知道RDotNet是不是这样子看他介绍应该是起一R引擎。。。。不懂.jpg使用RDotNet的步骤1、首先你要看懂一些简单的R程序就像你不懂sql 语句你怎么写ADO.NET程序一样 安装R的环境不要装最新的3.5版本因为R.NET并没有做到最新的版本看他的github就知道了我本地装的3.3.3一点问题都没有。如果你安装3.5版本会一直报一个空指针异常反正我被坑了。2、将我上面所说的示例代码库下载下来从最简单的代码开始看起。如下为开发过程中可能出现的问题而我遇到什么样的问题呢我是如何解决的还有哪些问题需要解决这个类库还有哪些问题不能解决他有哪些缺点回答上面的问题.1.我遇到的问题。1、安装过新的R环境3.5导致一直报错一点思路都没有。如何解决看github的issue看到有人提的问题大意是指。R.NET不能支持到最新的R语言版本。2、一个简单的程序在控制台上执行是OK的。然而在ASP.NET MVC程序上一直不成功。如何解决第一步先把R的环境变量配置好类似JDK的环境变量配置 找到自己的R语言位置将32位和64位的环境都配置至path中 ;C:\Program Files\R\R-3.3.3\bin\i386;C:\Program Files\R\R-3.3.3\bin\x64;
第二步如何还有问题的话比如一直报StackOverflowException的异常建议你看他的issue:这个是他们的讨论原本我也遇到这个问题但R的版本用了3.3,就没这个错了。3、当R的引擎正常结束后调用 dispose后下次调用 就会报错那就不调用 dispose方法吧。那个作者说There can only be one R engine in a process, and R itself is largely not thread-safe.2.还有哪些问题需要解决以管理员权限运行Rgui,并指定包安装的位置防止安装到其他目录 此命令设置当前包安装的位置.libPaths(C:/Program Files/R/R-3.3.3/library)
此命令查看当前包会安装的位置.libPaths()
如果有些包无法正常安装如果能找到那个包可直接复制其至目录C:/Program Files/R/R-3.3.3/library运行和发布后的代码都应运行在64位机子及平台上。3.这个类库还有哪些问题不能解决他有哪些缺点不能兼容所有的R版本目前只兼容到R3.3.3。如下代码在本机windows10 专业版 中文版电脑上运行会乱码 CharacterVector datFname engine.CreateCharacter(我是中文);
我研究下代码是这个类中的方法有问题InternalString 下的方法 StringFromNativeUtf8 /// summary/// Convert utf8 to string/// /summary/// param nameutf8utf8 to convert/parampublic static string StringFromNativeUtf8(IntPtr utf8){int len 0;while (Marshal.ReadByte(utf8, len) ! 0) len;byte[] buffer new byte[len];Marshal.Copy(utf8, buffer, 0, buffer.Length);return Encoding.UTF8.GetString(buffer);}
我在我本地调试源码时发现如果包含中文时采用Encoding.Default.GetString(buffer);转换这里就可以正常转换但这样子就只支持中文和英文了。而且好像在测试过程中改成Default后如下方法中包含中文反而乱码了。 string[] rownames engine.GetSymbol(rownames).AsCharacter().ToArray();
所以我准备直接用最简单的方式 判断buffer的编码如果不为UTF8,Convert为UTF8然后返回否则这里就需要多此一举因为在测试过程发现判断UTF8不准确明明不是UTF8还是返回了UTF8所以在这里需要判断转换后的数据是否包含中文如果包含则直接返回否则要从Default根据系统的编码决定转换为UTF8就能返回中文 。 /// summary/// Convert utf8 to string/// /summary/// param nameutf8utf8 to convert/parampublic static string StringFromNativeUtf8(IntPtr utf8){int len 0;while (Marshal.ReadByte(utf8, len) ! 0) len;byte[] buffer new byte[len];Marshal.Copy(utf8, buffer, 0, buffer.Length);Encoding encoding GetType(buffer);if (encoding.Equals(Encoding.UTF8)){string r Encoding.UTF8.GetString(buffer);if (System.Text.RegularExpressions.Regex.IsMatch(r, [\u4e00-\u9fbb]$)){return r;}else{byte[] newBuffer Encoding.Convert(Encoding.Default, Encoding.UTF8, buffer);return Encoding.UTF8.GetString(newBuffer);}}else{byte[] newBuffer Encoding.Convert(encoding, Encoding.UTF8, buffer);return Encoding.UTF8.GetString(newBuffer);}}
代码已放到github由于该 R.NET类库 长期未维护还是有很多BUG所以我fork了一份以便解决部分简单BUG问题 github开源地址相关博客介绍用C#调用R语言开发.NET MVC Web服务 此文章中介绍了.NET启动控制台调用R代码这个思路非常好一开始对R语言了解甚少所以还是使用R.NET来实现.NET与R语言的交互反而耗时耗力。一键运行R脚本 这个文章让我了解到Rscript.exe这个程序的作用以及执行方式。c#调用R语言原创翻译由于开发过程中有个R程序运行时间非常长最长可达2小时所以只能以后台任务方式执行但 RDotNET一次只能运行一个不执行完其他的程序在WEB项目下无法正常运行看了上面的文章有了思路 使用.NET的进程Process起一个cmd命令类似 java配置好环境变量后可使用java,javac命令一样配置到Path中后可直接在cmd中使用如下命令Rscript.exe 某目录下\test.R agruments
其中R程序包要有双引号 多个参数使用空格分隔 如下为.NET下使用Process启动cmd命令并执行Rscript.exe 命令启动R引擎让其后台运行运行结束后才会往后执行。 public void Execute(){Liststring arguments new Liststring{参数};Process cmd new Process{StartInfo {FileName Rscript.exe,WorkingDirectory AppFolders.RSourceCodeFolder,//.R代码的位置 E:\svn\CHNMed\CHNMed.Web\DataUsers\RSourceCodeUseShellExecute false,RedirectStandardOutput true,RedirectStandardError true,Arguments Test.r string.Join( , arguments),CreateNoWindow true,//不显示程序窗口}};cmd.Start();//启动程序var output cmd.StandardOutput.ReadToEnd();var error cmd.StandardError.ReadToEnd();cmd.WaitForExit();//等待控制台程序执行完成cmd.Close();//关闭该进程Logger.InfoFormat($参数{output}出错信息:{error});}