繁体   English   中英

从C#/。NET将数据表返回到R

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM