如何在 F# 中使用用户创建的 R 函数?

How do I use user-created R functions inside F#?

我有自己的 R 函数,想在 F# 中使用。我该怎么做?

open RProvider
open RDotNet

let f1 = R.eval(R.parse(text="function(x) x + 1")).AsFunction()

// I expect the following line to give me 5 but it doesn't work
f1([|4|])

为了调用该函数,您必须使用类型提供程序将值传递给 R。然后,在R端用传入的数据调用函数,最后将结果带回F#:

let res = R.sapply(R.c(4),f1).AsInteger().[0]

这会产生以下输出

val f1 : Function

val res : int = 5

您可以在 http://bluemountaincapital.github.io/FSharpRProvider/passing-data.html

上找到更多信息

特别是,统计走查显示了来回传递技术的扩展示例,包括 data.frames:http://bluemountaincapital.github.io/FSharpRProvider/Statistics-QuickStart.html

正如 Thomas Jaskula 所回答的那样,正确的技术是传递给 R 并在该侧进行评估。

这是另一个不依赖于将函数赋值给 F# 变量的示例:

另一个例子:

R.assign("y",[|1;2;3|])
let z = R.eval(R.parse(text="
    f2 <- function(x) x + 2
    f2(y)")).AsInteger() |> Seq.toArray

val z : int [] = [|3; 4; 5|]