如何在 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|]
我有自己的 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|]