gpt4 book ai didi

c# - 向/从 rClr 提供和检索数据集

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:16 26 4
gpt4 key购买 nike

我尝试使用 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)

从函数中检索一个coustumclasses数组
返回值的示例代码 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)

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

在检索时我得到了一个看起来非常复杂的对象。也许有某种方法可以将其转换为数据框?

最佳答案

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

c#代码包含:

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

R代码:

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

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();
}



}
}

关于c# - 向/从 rClr 提供和检索数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32245055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com