当前位置: 首页 > 知识库问答 >
问题:

用JuliaCall将NAs从R传递到Julia函数

浦思源
2023-03-14

我试图编写一个Julia函数(在本例中为weighted_sum)并在R中使用它。

function weighted_sum(v::Vector, w::Vector, skipmissing::Bool)
    if skipmissing
        v = v[findall(!ismissing, v)]
        w = w[findall(!ismissing, v)]
    end
    return sum(v .* w)
end

println(weighted_sum([1, 2, 3, 1], [1, 2, 2, 1], true))
#> 12
println(weighted_sum([1, 2, 3, missing], [1, 2, 2, 1], true))
#> 11

R代码:

library(JuliaCall)

julia_weighted_sum_function <- JuliaCall::julia_eval("function weighted_sum(v::Vector, w::Vector, skipmissing::Bool)
    if skipmissing
        v = v[findall(!ismissing, v)]
        w = w[findall(!ismissing, v)]
    end
    return sum(v .* w)
end")
#> Julia version 1.5.0 at location C:\Users\{path_to_julia}\julia\V15~1.0\bin will be used.
#> Loading setup script for JuliaCall...
#> Finish loading setup script for JuliaCall.

weighted_sum_jl <- function(x, weights, epsilon, na.rm = TRUE){
  
  JuliaCall::julia_call("weighted_sum", x, weights, na.rm)
  
}

weighted_sum_jl(x = c(1, 2, 3, 1), w = c(1, 2, 2, 1), TRUE)
#> [1] 12


weighted_sum_jl(x = c(1, 2, 3, NA), w = c(1, 2, 2, 1), TRUE)
#> Error: Error happens in Julia.
#> MethodError: no method matching weighted_sum(::Base.ReshapedArray{Union{Missing, Float64},1,Array{Union{Missing, Float64},1},Tuple{}}, ::Array{Float64,1}, ::Bool)
#> Closest candidates are:
#>   weighted_sum(!Matched::Array{T,1} where T, ::Array{T,1} where T, ::Bool) at none:1
#> Stacktrace:
#>  [1] docall(::Ptr{Nothing}) at C:\Users\{path_to_R}\R\win-library\4.0\JuliaCall\julia\setup.jl:176

由reprex包(v2.0.1)在2021-09-05创建

sessioninfo::session_info()
#> - Session info ---------------------------------------------------------------
#>  setting  value                       
#>  version  R version 4.0.5 (2021-03-31)
#>  os       Windows 10 x64              
#>  system   x86_64, mingw32             
#>  ui       RTerm                       
#>  language (EN)                        
#>  collate  English_United Kingdom.1252 
#>  ctype    English_United Kingdom.1252 
#>  tz       Europe/Berlin               
#>  date     2021-09-05                  
#> 
#> - Packages -------------------------------------------------------------------
#>  package     * version date       lib source        
#>  cli           2.4.0   2021-04-05 [1] CRAN (R 4.0.5)
#>  digest        0.6.27  2020-10-24 [1] CRAN (R 4.0.5)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.0.5)
#>  fs            1.5.0   2020-07-31 [1] CRAN (R 4.0.5)
#>  glue          1.4.2   2020-08-27 [1] CRAN (R 4.0.5)
#>  highr         0.8     2019-03-20 [1] CRAN (R 4.0.5)
#>  htmltools     0.5.1.1 2021-01-22 [1] CRAN (R 4.0.5)
#>  JuliaCall   * 0.17.4  2021-05-16 [1] CRAN (R 4.0.5)
#>  knitr         1.32    2021-04-14 [1] CRAN (R 4.0.5)
#>  magrittr      2.0.1   2020-11-17 [1] CRAN (R 4.0.5)
#>  ps            1.6.0   2021-02-28 [1] CRAN (R 4.0.5)
#>  Rcpp          1.0.7   2021-07-07 [1] CRAN (R 4.0.5)
#>  reprex        2.0.1   2021-08-05 [1] CRAN (R 4.0.5)
#>  rlang         0.4.10  2020-12-30 [1] CRAN (R 4.0.5)
#>  rmarkdown     2.7     2021-02-19 [1] CRAN (R 4.0.5)
#>  rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.0.5)
#>  sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.5)
#>  stringi       1.5.3   2020-09-09 [1] CRAN (R 4.0.3)
#>  stringr       1.4.0   2019-02-10 [1] CRAN (R 4.0.5)
#>  withr         2.4.1   2021-01-26 [1] CRAN (R 4.0.5)
#>  xfun          0.22    2021-03-11 [1] CRAN (R 4.0.5)
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.0.4)

共有1个答案

唐裕
2023-03-14

因此,Julia中的missing是其他语言中缺少值的一种概括。不清楚为什么r中的na出现问题。尝试更改为nan作为输入,它通过使用isnan来工作

library(JuliaCall)
julia_weighted_sum_function <- JuliaCall::julia_eval("function weighted_sum(v::Vector, w::Vector, skipmissing::Bool)
    
    if skipmissing
        v = v[findall(!isnan, v)]
        v = v[findall(!ismissing, v)]
        w = w[findall(!ismissing, v)]
    end
    return sum(v .* w)
end")
weighted_sum_jl <- function(x, weights, epsilon, na.rm = TRUE){
  
  JuliaCall::julia_call("weighted_sum", x, weights, na.rm)
  
}

-测试

> weighted_sum_jl(x = c(1, 2, 3, 1), w = c(1, 2, 2, 1), TRUE)
[1] 12
> weighted_sum_jl(x = c(1, 2, 3, NaN), w = c(1, 2, 2, 1), TRUE)
[1] 11
 类似资料:
  • 有人这样做过吗?怎么做?

  • 我试图编写一个函数,该函数采用数据帧和变量名(或变量名列表),并使用group_by和summary函数输出摘要信息。然而,我不断得到以下错误之一: 或此错误: 最后一个错误表示它找不到名为“value”的列,该列包含数据框的值(熔化后)。 这是我的代码: 这是一个小数据示例。请注意,“变量”是一个总是被传递到group_by函数中的列,所以我决定将其硬编码。 如何编写此函数,使其接受group_

  • 我正在处理平台频道(PlatformChannels),试图从Kotlin(Kotlin)到Flatter(颤振)进行通信。尝试实际执行颤振平台频道文档中解释的操作,但方向相反: 通道文件颤振平台 其思想是从MainActivity上的ConfigureFlatterEngine函数调用颤振函数。kt级。 为此,我做了,在颤振方面,梅因。dart(颤振的默认示例): 从Kotlin方面来说,我只是

  • 问题内容: 我可以在R中使用以下代码在任何通用SQL数据库中选择不同的行。我会使用,但SQL语法不支持它。无论如何,这确实有效: 我一直在成功使用它,但是想知道如何在其他dplyr步骤之后传递相同的SQL查询,而不是像上面所示那样仅将其用作第一步。最好用一个例子来说明: 因此,我有两个SQL表,然后我要查看不同的行,并保留所有列。是否如上所述将SQL代码通过管道传递到R中(简单地利用该函数)?如果

  • 我在C 11应用程序中有长时间运行的功能,基本上是。我需要通知这个函数在不同线程中出现。要求: 可以随时上升。 应用程序最多只能在一个地方处理(也可以不处理)。 它不需要超快速执行,也不需要延迟执行 截至目前,我考虑了两种选择: 传递包含。然后在<code>sub_main</code>内定期轮询对象,以了解新的<code>情况</code>。轮询对象已从队列中删除。当应用程序决定不处理特定位置的