[英]Returning Datatable to R from C#/.NET
我正在尝试从R调用.NET DLL文件并返回一个数据表。
这个问答展示了如何从R调用.NET并能正常工作,但是我找不到任何有关如何返回数据的文档(除了简单的值,例如字符串):
.NET方法:
public DataTable GetDatatable(string parameters)
{
var dt = new DataTable();
dt.Columns.Add("Dates", typeof(DateTime));
dt.Columns.Add("Strings", typeof(String));
dt.Columns.Add("Number", typeof(Double));
DataRow dr = dt.NewRow();
dr[0] = new DateTime(2014, 1, 23);
dr[1] = "test";
dr[2] = 123.45;
dt.Rows.Add(dr);
return dt;
}
内部R:
> library(rClr)
> clrLoadAssembly('C:/Dev/Sandbox/XYZ/bin/Debug/XYZ2R.dll')
> myObj <- clrNew('XYZ2R.DAL,XYZ2R')
> res = clrCall(myObj,'GetDatatable', "parameter")
> res
类“ cobjRef”的对象
插槽“ clrobj”:
<指针:0x0027f218>
插槽“ clrtype”:
[1]“ System.Data.DataTable”
RES [0,1]
res [0,1]中的错误:'S4'类型的对象不可子集化
从我阅读的内容来看,我需要将“ by ref”参数传递给一个参数,例如:
public void Test(string parameters, params List<string>[] data)
尽管我不确定,也没有任何从R调用.NET方法并返回列表的示例。 有几篇文章讨论了相反的情况。
我怎样才能做到这一点?
使用当前发布的程序包,并使用您的测试方法,以下内容可正确检索项目
library(rClr)
clrLoadAssembly('c:/tmp/DataTableTest/bin/Debug/DataTableTest.dll')
obj <- clrNew('DataTableTest.Class1')
dataTable <- clrCall(obj, 'GetDatatable', '')
clrReflect(dataTable)
dv <- clrGet(dataTable, 'DefaultView')
clrReflect(dv)
getTableItem <- function(view, rowInd, colInd) {
dataRowView <- clrCall(view, 'get_Item', as.integer(rowInd))
clrCall(dataRowView, 'get_Item', as.integer(colInd))
}
getTableItem(dv, 0L, 0L)
getTableItem(dv, 0L, 1L)
getTableItem(dv, 0L, 2L)
在接下来的几个月中,我将进行一些语法改进。 我注意到DataTable和相关类是数据帧的自然同级,并将尝试为其提供更简洁的语法。 随时在
https://rclr.codeplex.com
https://github.com/jmp75/rClr上记录详细的功能请求
使用clrReflect方法可以很容易地从R检查.NET对象的方法和属性:
> clrReflect(数据表)
$方法
[1]“ AcceptChanges”“ add_ColumnChanged”“ add_ColumnChanging”“ add_Disposed”“ add_Initialized”“ add_RowChanged”
[7]“ add_RowChanging”“ add_RowDeleted”“ add_RowDeleting”“ add_TableCleared”“ add_TableClearing”“ add_TableNewRow”
[13]“ BeginInit”,“ BeginLoadData”,“清除”,“克隆”,“计算”,“复制”
[19]“ CreateDataReader”“处置”“ EndInit”“ EndLoadData”“等于”“ get_CaseSensitive”
[25]“ get_ChildRelations”“ get_Columns”“ get_Constraints”“ get_Container”“ get_DataSet”“ get_DefaultView”
[31]“ get_DesignMode”“ get_DisplayExpression”“ get_ExtendedProperties”“ get_HasErrors”“ get_IsInitialized”“ get_Locale”
[37]“ get_MinimumCapacity”“ get_Namespace”“ get_ParentRelations”“ get_Prefix”“ get_PrimaryKey”“ get_RemotingFormat”
[43]“ get_Rows”“ get_Site”“ get_TableName”“ GetChanges”“ GetChanges”“ GetErrors”
[49]“ GetHashCode”“ GetObjectData”“ GetService”“ GetType”“ ImportRow”“加载”
[55]“加载”“加载”“ LoadDataRow”“ LoadDataRow”“合并”“合并”
[61]“合并”“ NewRow”“ ReadXml”“ ReadXml”“ ReadXml”“ ReadXml”
[67]“ ReadXmlSchema”“ ReadXmlSchema”“ ReadXmlSchema”“ ReadXmlSchema”“ RejectChanges”“ remove_ColumnChanged”
[73]“ remove_Columnchanging”“ remove_Disposed”“ remove_Initialized”“ remove_RowChanged”“ remove_RowChanging”“ remove_RowDeleted”
[79]“ remove_RowDeleting”“ remove_TableCleared”“ remove_TableClearing”“ remove_TableNewRow”“重置”“选择”
[85]“选择”“选择”“选择”“ set_CaseSensitive”“ set_DisplayExpression”“ set_Locale”
[91]“ set_MinimumCapacity”“ set_Namespace”“ set_Prefix”“ set_PrimaryKey”“ set_RemotingFormat”“ set_Site”
[97]“ set_TableName”“ ToString”“ WriteXml”“ WriteXml”“ WriteXml”“ WriteXml”
[103]“ WriteXml”“ WriteXml”“ WriteXml”“ WriteXml”“ WriteXml”“ WriteXml”
[109]“ WriteXml”“ WriteXml”“ WriteXml”“ WriteXml”“ WriteXml”“ WriteXml”
[115]“ WriteXmlSchema”“ WriteXmlSchema”“ WriteXmlSchema”“ WriteXmlSchema”“ WriteXmlSchema”“ WriteXmlSchema”
[121]“ WriteXmlSchema”“ WriteXmlSchema”
$场
字符(0)
$属性
[1]“ CaseSensitive”,“ ChildRelations”,“ Columns”,“ Constraints”,“ Container”,“ DataSet”,“ DefaultView”,“ DesignMode”
[9]“ DisplayExpression”,“ ExtendedProperties”,“ HasErrors”,“ IsInitialized”,“ Locale”,“ MinimumCapacity”,“ Namespace”,“ ParentRelations”
[17]“前缀”“ PrimaryKey”“ RemotingFormat”“行”“站点”“ TableName”
> clrReflect(dv)
$方法
[1]“ add_Disposed”“ add_Initialized”“ add_ListChanged”“ AddNew”“ BeginInit”“ CopyTo”“删除”“ Dispose”
[9]“ EndInit”“等于”“等于”“查找”“查找”“ FindRows”“ FindRows”“ get_AllowDelete”
[17]“ get_AllowEdit”“ get_AllowNew”“ get_ApplyDefaultSort”“ get_Container”“ get_Count”“ get_DataViewManager”“ get_DesignMode”“ get_IsInitialized”
[25]“ get_Item”“ get_RowFilter”“ get_RowStateFilter”“ get_Site”“ get_Sort”“ get_Table”“ GetEnumerator”“ GetHashCode”
[33]“ GetService”,“ GetType”,“ remove_Disposed”,“ remove_Initialized”,“ remove_ListChanged”,“ set_AllowDelete”,“ set_AllowEdit”,“ set_AllowNew”
[41]“ set_ApplyDefaultSort”“ set_RowFilter”“ set_RowStateFilter”“ set_Site”“ set_Sort”“ set_Table”“ ToString”“ ToTable”
[49]“ ToTable”“ ToTable”“ ToTable”
$场
字符(0)
$属性
[1]“ AllowDelete”“ AllowEdit”“ AllowNew”“ ApplyDefaultSort”“容器”“ Count”“ DataViewManager”“ DesignMode”“ IsInitialized”“ Item”“ RowFilter”“ RowStateFilter”“站点”“排序”“表”
要调用方法,请使用clrCall(dotNetObject,'MethodName')
要查看属性,请使用clrGet(dotNetObject,'PropertyName')
例如,让我们计算从GetDatatable方法返回的DataTable中的行数:
> clrCall(dv,'get_Count')
[1] 2
现在让我们计算出列数:
> clrGet(dataTable,'Columns')
类“ cobjRef”的对象
插槽“ clrobj”:
插槽“ clrtype”:
[1]“ System.Data.DataColumnCollection”
> cols <-clrGet(dataTable,'Columns')
> clrReflect(cols)
$方法
[1]“添加”“添加”“添加”“添加”“添加”“ add_CollectionChanged”
[7]“ AddRange”“ CanRemove”“清除”“包含”“ CopyTo”“ CopyTo”
[13]“等于”“ get_Count”“ get_IsReadOnly”“ get_IsSynchronized”“ get_Item”“ get_Item”
[19]“ get_SyncRoot”“ GetEnumerator”“ GetHashCode”“ GetType”“ IndexOf”“ IndexOf”
[25]“删除”“删除”“ remove_CollectionChanged”“ RemoveAt”“ ToString”
$场
字符(0)
$属性
[1]“计数”“ IsReadOnly”“ IsSynchronized”“项目”“项目”“ SyncRoot”
> clrGet(cols,'Count')
[1] 26
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.