【问题标题】:Give and retrieve dataset to/from rClr向/从 rClr 提供和检索数据集
【发布时间】:2015-08-27 09:04:36
【问题描述】:

我尝试使用 rClr。我发现了如何将“普通”(基本类型)参数提供给 clr 函数。我还能够从函数中检索“正常”值。

问题:
带来许多数据,例如一个数据帧(每帧有很多条目)到一个 c# 函数中。
参数的示例数据框

namerecord1 <- data.frame(id=1, name='A', lastname="a", coordinate=1.23456)
namerecord2 <- data.frame(id=2, name='B', lastname="b", coordinate=2.4560789)
argument <- rbind(namerecord1, namerecord2)

从函数中检索一个 coutumclasses 数组
返回值的示例代码c#

List<NameRecord> tmpResult = new List<NameRecord>(3);
tmpResult.Add(new NameRecord { Name = "ASDF", LastName = "asdf", Id = 1, DoubleValue = 1.456789 });
tmpResult.Add(new NameRecord { Name = "QWER", LastName = "qwer", Id = 2, DoubleValue = 2.456789 });
tmpResult.Add(new NameRecord { Name = "YXCV", LastName = "yxcv", Id = 3, DoubleValue = 3.456789 });
return tmpResult.ToArray();

我尝试了什么

result <- clrCall(object, 'SetArgument', argument)

但在给定的参数中只有一个对象 -Array 有四个空值。

在检索时,我得到了一个看起来非常复杂的对象。也许有办法在数据框中转换它?

【问题讨论】:

  • 不清楚您要做什么?您可以添加您的 c# 函数的签名(此处为 SetArgument)吗?
  • 首先,这只是一个示例应用程序:-) 当它工作时,我会去做生产代码。但是我尝试了 SetArgument(object arg) - 这给出了空对象数组 - 我也尝试了 SetArgument(NameRecord[] arg) - 这导致了一个错误,它说:在类型 rClrTest.TestClass1 上找不到合适的实例方法 SetArgument方法参数 Object[]
  • 参数如何进入c#函数并不重要。我只需要它们以可用的形式在里面。 - 使用的数据由大约 1000 个具有许多字段的数据对象组成

标签: c# r rclr


【解决方案1】:

这里有一个解决方案,显示使用rClr 包获取/设置Rc# 之间的复杂数据结构。

c# 代码包含:

  1. 自定义类NameRecord
  2. GetObjects 返回 NameRecord 的数组
  3. SetObjects 获取多个参数作为数组来设置NamedRecord 对象并返回NameRecord 的数组。

R 代码:

  1. 定义一个方便的函数,将NamedRecord 对象列表转换为data.frame。
  2. 调用SetObjectsGetObjects已经定义在c#

R 代码:

library(rClr)
f <- file.path(path_to_net_dll,"ClassLibrary1.dll")
clrLoadAssembly(f)
obj <- clrNew("ClassLibrary1.Class1")

## This the most important and difficult part of the code
rclr2R_obj <-
  function(rclr_objs){
    fields <- c("DoubleValue" ,"Id","LastName","Name" )

    fields_to_DF <- function(x)
      setNames(data.frame(
        lapply(fields,function(f)clrGet(x,f))),
        fields)

    do.call(rbind,lapply(rclr_objs,fields_to_DF))
  }

new_data_frame <- rclr2R_obj(clrCall(obj,"GetObjects"))

#   DoubleValue Id LastName Name
# 1    1.456789  1     asdf ASDF
# 2    2.456789  2     qwer QWER
# 3    3.456789  3     yxcv YXCV

names <- letters[1:4]
lnames <- LETTERS[1:4]
ids <- as.integer(1:4)
vals <- as.numeric(runif(4))

res <- clrCall(obj,"SetObjects",names,lnames,ids,vals)
new_data_frame <- rclr2R_obj(res)

#    DoubleValue Id LastName Name
# 1  0.90695438  1        A    a
# 2  0.28337886  2        B    b
# 3  0.99027692  3        C    c
# 4  0.05794843  4        D    d

c#代码

namespace ClassLibrary1
{
    public class Class1
    {
        // a simple c# class
        public class NameRecord
        {
            public string Name;
            public string LastName;
            public int Id;
            public double DoubleValue;
        }

        public NameRecord[] GetObjects()
        {
            List<NameRecord> tmpResult = new List<NameRecord>(3);
            tmpResult.Add(new NameRecord { Name = "ASDF", LastName = "asdf", Id = 1, DoubleValue = 1.456789 });
            tmpResult.Add(new NameRecord { Name = "QWER", LastName = "qwer", Id = 2, DoubleValue = 2.456789 });
            tmpResult.Add(new NameRecord { Name = "YXCV", LastName = "yxcv", Id = 3, DoubleValue = 3.456789 });
            return tmpResult.ToArray();
        }


        public NameRecord[] SetObjects(string[] names,string[] lnames,int[] ids,double[] vals)
        {
            List<NameRecord> tmpResult = new List<NameRecord>();

            for (var i = 0; i < names.Length; i++)
            {
                tmpResult.Add(new NameRecord { 
                    Name = names[i], 
                    LastName = lnames[i], 
                    Id = ids[i], 
                    DoubleValue = vals[i]
                });
            }

            return tmpResult.ToArray();
        }



    }
}

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 2013-08-06
    • 2015-12-18
    • 2016-02-14
    • 2018-08-11
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多