如何在R包JuliaConnectoR中传递Julia类型

rxztt3cl  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(143)

我尝试使用R包JuliaConnectoR来处理Julia包EvoTrees,我知道如何将R中定义的数值参数传递给Julia(例如,一个double被转换为Float64),但我不知道如何在R中定义一个参数来描述Julia中的类型。
下面是一个例子:

n_obs = 100 
n_features = 100
nrounds = 10L

set.seed(20221224)

x_train = matrix(ncol= n_features, rnorm(n_obs*n_features))
y_train = rnorm(n_obs)

library(JuliaConnectoR)
evoTrees = juliaImport("EvoTrees")
params_evo = evoTrees$EvoTreeRegressor(nrounds=nrounds , loss = as.symbol("linear"), alpha=0.5,lambda=0.0,gamma=0.0)

evoTrees_model = evoTrees$fit_evotree(params_evo, x_train, y_train, print_every_n = 50L)

evoTrees$EvoTreeRegressor的调用工作正常,例如,可以通过as.symbol("linear")传递julia符号:linear,并且传递像nrounds这样的数字参数也很清楚。但是,我在调用fit evoTrees$fit_evotree时得到了以下错误消息:
错误:Julia中的求值失败。原始Julia错误消息:方法错误:没有匹配fit_evotree(::进化树.进化树回归函数{进化树.线性,浮点数32},::矩阵{浮点数64},::向量{浮点数64}; print_every_n = 50)最接近的候选项是:fit_进化树(::联合{进化树.进化树分类器{L,T},进化树.进化树计数{L,T},进化树.进化树高斯{L,T},进化树.进化树MLE {L,T},进化树.进化树回归{L,T}}; x_train、y_train、w_train、偏移_train、x_eval、y_eval、w_eval、偏移_eval、度量、提前停止循环、打印每n、详细度、文件名、返回记录器),其中{L,T}位于C:\Users\rwarn.julia\packages\EvoTrees\ayRL8\src\fit.jl:309堆栈跟踪:[1] invokelest(::任意,::任意,::Vararg {任意}; kwargs::Base. Pairs {符号,Int64,元组{符号},命名元组{(:print_every_n,),元组{Int64}}})@Base.\essentials.jl:731 [2] evaluate!(调用::Main. R连接器.调用,通信器::Main. R连接器.通信器{套接字. TCPSocket})@Main. R连接器C:\用户\r警告\文档\r\win-l
我对此错误的解释如下:如果不通过Julia参数T传递类型,则假定数据类型为Float32。然而,R类型double中的train数据被转换为Julia类型Float64。我认为,解决方案是将Julia类型Float64传递给evoTrees$EvoTreeRegressor。我该如何做呢?谢谢!
信息:JuliaConnectoR:版本1.1.1进化树版本0.14.2
会话信息()R版本4.1.1(2021年8月10日)平台:x86_64-w64-mingw32/x64(64位)运行环境:Windows 10 x64(内部版本号22621)
基质产品:缺省
区域设置:[1] LC_COLLATE =德国_奥地利.1252 LC_类型=德国_奥地利.1252 LC_货币=德国_奥地利.1252 [4] LC_数值= C LC_时间=德国_奥地利.1252
随附基础 Package :[1]统计图形grDevices实用程序
数据集方法库
其他随附 Package :[1]朱莉娅连接R_1.1.1
通过名称空间加载(且未附加):[1]编译器_4.1.1标签_1.0.1工具_4.1.1

ma8fv8wu

ma8fv8wu1#

是的,你是对的,默认的类型是Float32,可以在下面的代码中看到。
构造函数也接受关键字参数T来定义类型。如果你想传递Julia类型Float64作为这个参数的值,你可以像下面这样做:

params_evo = evoTrees$EvoTreeRegressor(T = juliaExpr("Float64"), 
    rounds=nrounds, loss = as.symbol("linear"), alpha=0.5, lambda=0.0, gamma=0.0)

JuliaConnectoRjuliaExpr函数允许在R的调用中使用任意Julia表达式。表达式在Julia中求值,结果值在此处使用。这对于函数的参数无法在R中正确表达的情况非常有用。
另一种方法是使用juliaEval函数,在这种情况下,它将给予与juliaExpr相同的输出,但是在进行函数调用之前,它将进行从Julia到R的往返。
创建的EvoTreeRegressor对象现在使用Julia Float64类型:

> params_evo
<Julia object of type EvoTrees.EvoTreeRegressor{EvoTrees.Linear, Float64}>
EvoTrees.EvoTreeRegressor{EvoTrees.Linear, Float64}(10, 0.0, 0.0, 0.1, 5, 1.0, 1.0, 1.0, 32, 0.5, Dict{Int64, Int64}(), Random.TaskLocalRNG(), "cpu")

相关问题