在 F# 中加载 RProvider

loading RProvider in F#

我仍然是 F# 的菜鸟,我不了解加载和使用包的所有语法和逻辑。

例如,我想使用(蓝山的)RProvider。 http://bluemountaincapital.github.io/FSharpRProvider/index.html

使用 VS2015,在我当前的解决方案中,我已经使用 PM 控制台和 Install-Package RProvider

安装了软件包

我对 RProvider.fsx 做了一些修改,因为我有更新版本的 R.NET 社区

#nowarn "211"
// Standard NuGet or Paket location
#I "."
#I "lib/net40"

// Standard NuGet locations for R.NET
#I "../R.NET.Community.1.6.4/lib/net40"
#I "../R.NET.Community.FSharp.0.1.9/lib/net40"

// Standard Paket locations for R.NET
#I "../R.NET.Community/lib/net40"
#I "../R.NET.Community.FSharp.1.6.4/lib/net40"

// Try various folders that people might like
#I "bin"
#I "../bin"
#I "../../bin"
#I "lib"
#I "../packages"

// Reference RProvider and RDotNet 
#r "RDotNet.dll"
#r "RDotNet.FSharp.dll"
#r "RProvider.dll"
#r "RProvider.Runtime.dll"

open RProvider
do fsi.AddPrinter(fun (synexpr:RDotNet.SymbolicExpression) -> synexpr.Print())

现在我的问题是

1) 如何从 F# interactive 加载包 (RProvider)? 好吧,实际上我设法这样做了 例如 RProvider.fsx 文件在路径中 C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford\packages\RProvider.1.1.15\RProvider.fsx

我做的是

#I @"C:\Users\Fagui\Documents\GitHub\Learning Fsharp\Algo Stanford";;
#load "packages\RProvider.1.1.15\RProvider.fsx";;

而且有效:-) 但是我可以避免写整个路径吗?

2) 在 VS2015 中,如果我想将它包含在解决方案中...... 在解决方案资源管理器中,我包含了 RProvider.fsx 文件(在 AssemblyInfo.fs、App.config 和 packages.config 之后,对吗?) 最后是程序本身 Rtype.fs

我正在尝试重现来自 http://bluemountaincapital.github.io/FSharpRProvider/Statistics-QuickStart.html

open System
open *RDotNet* // the namespace or module 'RDotNet' is not defined
open *RProvider*
open *RProvider*.graphics
open RProvider.stats 

// let x = System.Environment.CurrentDirectory
// val x : string

printfn "hello world"

Console.ReadKey() |> ignore

// Random number generator
let rng = Random()
let rand () = rng.NextDouble()

// Generate fake X1 and X2 
let X1s = [ for i in 0 .. 9 -> 10. * rand () ]
let X2s = [ for i in 0 .. 9 -> 5. * rand () ]

// Build Ys, following the "true" model
let Ys = [ for i in 0 .. 9 -> 5. + 3. * X1s.[i] - 2. * X2s.[i] + rand () ]

let dataset =
    namedParams [
        "Y", box Ys;
        "X1", box X1s;
        "X2", box X2s; ]
    |> R.data_frame

let result = R.lm(formula = "Y~X1+X2", data = dataset)
let coefficients = result.AsList().["coefficients"].AsNumeric()
let residuals = result.AsList().["residuals"].AsNumeric()
let summary = R.summary(result)
*summary.AsList().["r.squared"].AsNumeric()
R.plot result*

//这个表达式的类型应该是 'unit' 但类型是 'NumericVector'...

我通过 Intellisense 获得了一些 warnings/errors,尽管编译器管理了构建。 执行 exe 时,windows 屏幕看起来很忙,我设法看到了一些图表,但它们看起来与 Rtype.fs 所说的无关...

感谢您的帮助!

编辑

首先,我不建议使用与 RProvider 作为依赖项自动安装的版本不同的 R.NET 版本。加载有点脆弱,可能会破坏东西。

1) 关于路径,您应该能够将相对路径传递给 #load,因此只需从脚本中删除 #I 即可。

2) 从项目(而不是从脚本文件)引用依赖项时,您需要向项目引用添加依赖项。在 Visual Studio 中,这是通过右键单击项目中的 "References" 并使用 "Add Reference" 来完成的。对于类型提供者,您还需要在加载引用时单击 "Enable"。