我第一次尝试通过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.Date
是System.DateTime
,p.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但这并没有什么区别。
我还应该说,我对series
和Frame.ofRecords
的使用在这一点上几乎是猜测。
非常感谢。
编辑:
这是一个已编译的.NET 4.6项目,其中RProvider(1.1.20)和Deedle.RPlugin(1.2.5)通过Nuget添加。
ggplot2可以从RGui中正常工作。
答案 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等。
<强>参考文献:强>
这是一个空项目,可以创建Deedle和RProvider相关的包。