'没有注册Deedle.Frame'类型的转换器使用F#R类型提供程序和ggplot2

时间:2016-10-01 12:11:47

标签: r ggplot2 f# deedle

我第一次尝试通过F#R类型提供商使用R&G的GGPlot2。

这是我的代码:

let (++) (plot1:RDotNet.SymbolicExpression) (plot2:RDotNet.SymbolicExpression) = 
    R.``+``(plot1, plot2) 

let ChartGgPlot2 (prices : Prices) =
    try
        let fileName = makeFile ".png"
        let priceSeries = prices.Prices |> Seq.map (fun p -> p.Date, p.Close) |> series
        let dataFrame = Deedle.Frame.ofRecords priceSeries

        R.png(filename=fileName, height=200, width=300, bg="white") |> ignore
        R.ggplot(
            namedParams[
                "data", box dataFrame; 
                "mapping", box (
                    R.aes__string(x="Date", y="Close"))])
        ++ R.geom__point() |> ignore
        R.dev_off() |> ignore
        fileName |> Choice.succeed
    with
    | e -> Choice.fail e.Message

p.DateSystem.DateTimep.Close是双倍。

在运行时,我在调用R.ggplot

时遇到此异常
  

没有为Deedle.Frame`2 [[System.DateTime,   mscorlib,版本= 4.0.0.0,文化=中性,   PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]或   任何基本类型

我已尝试过此处建议的解决方案(复制两个DLL):Deedle frame to R但这并没有什么区别。

我还应该说,我对seriesFrame.ofRecords的使用在这一点上几乎是猜测。

非常感谢。

编辑:

  • 这是一个已编译的.NET 4.6项目,其中RProvider(1.1.20)和Deedle.RPlugin(1.2.5)通过Nuget添加。

  • ggplot2可以从RGui中正常工作。

2 个答案:

答案 0 :(得分:2)

Tomas关于配置文件和探测位置的评论不是答案 - 但它让我了解了实际上的答案。

我需要使用Nuget添加对Deedle.RPlugin的引用,不仅是对正在进行R调用以呈现图表的程序集,而且还是对引用图表程序集的'main'程序集。

我不知道这是否是构建系统与类型提供程序交互方式的固有限制。但是现在我很高兴有一个解决方法。

(出于教学目的,知道是否可以进行长期修复会很棒。)

非常感谢那些回复的人。

答案 1 :(得分:0)

您的FSLab和/或Rprovider安装很可能会出现问题。例如,这应该工作:

#load @"..\..\FSLAB\packages\FsLab\FsLab.fsx"
open System
open Deedle
open FSharp.Charting
open System
open RDotNet
open RProvider
open RProvider.graphics
open RProvider.stats 
open RProvider.datasets 
open RProvider.ggplot2

type DtPx = {
    Dt:System.DateTime
    Px:float
}

let rnd = System.Random()
let nextPx() = rnd.NextDouble() - 0.5
let nextDay i = DateTime.Today.AddDays(float i)

let data = List.init 100 (fun i -> {Dt=nextDay i;Px = nextPx()})
let df = Frame.ofRecords data

let mtc = R.mtcars.GetValue<Frame<string, string>>()
let (++) (plot1:RDotNet.SymbolicExpression) (plot2:RDotNet.SymbolicExpression) = 
    R.``+``(plot1, plot2)


R.ggplot(
    namedParams[
        "data", box mtc; 
        "mapping", box (
            R.aes__string(x="disp", y="drat"))])
++ R.geom__point()

R.ggplot(
            namedParams[
                "data", box df; 
                "mapping", box (
                    R.aes__string(x="Dt", y="Px"))])
++ R.geom__point()

您可以在fsx文件中使用它,也可以在编译的.exe中使用它来将输出保存到png。在这种情况下,您还必须引用DynamicInterop,RDotNet,Rprovider等。

Random Px

<强>参考文献:

Updated References

这是一个空项目,可以创建Deedle和RProvider相关的包。