在F#中加载RProvider

时间:2016-01-24 15:28:57

标签: r f# package install type-providers

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

例如,我想使用(Blue Mountain' s)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得到了一些警告/错误。 执行exe时,看起来Windows屏幕很忙,我设法看到一些图形,但看起来它们与Rtype.fs所说的无关......

感谢您的帮助!

修改 enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

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