- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 FSharp.Charting 探索 F# 我原以为我会从一个简单的“hello world”开始,但它留给我的问题比代码行还多。
#load @"..\packages\FSharp.Charting.0.90.14\FSharp.Charting.fsx"
open FSharp.Charting
let chart = Chart.Line([ for x in 0 .. 10 -> x, x*x ])
chart.ShowChart()
chart.SaveChartAs(@"C:\Temp\chart.png",ChartTypes.ChartImageFormat.Png)
这在 VS 的交互式窗口中有效,但我想做的是从 cmd 行(使用 fsi.exe)执行此脚本。我将 fsx 文件关联到 fsi,但是当我执行它时,它会打开 fsi 但没有创建图表。我需要做什么?
最佳答案
简答:在程序末尾添加以下行:
System.Windows.Forms.Application.Run()
图表确实创建了,但它立即消失了,因为您的程序在创建图表后立即退出。这不会发生在 Visual Studio 的 F# 交互窗口中,因为 F# 交互窗口不会在执行您的程序后立即关闭 - 它只是卡在那里,等待您提交更多代码以供执行。
为了让你的程序不立即退出,你可以实现一些等待机制,比如等待一段设定的时间(参见System.Threading.Thread.Sleep
)或者等待用户按 Enter(通过 stdin.ReadLine()
)等
但是,这实际上对您没有帮助,因为存在下一个问题:图表是通过 Windows 窗体绘制的,它依赖于 message loop正在运行 - 否则窗口无法接收消息,因此无法绘制自身。
金融服务机构does have its own built-in event loop ,这就是您的程序在 VS 下的工作方式。但是,如果您实现“等待”机制(例如 stdin.ReadLine()
),此事件循环将被阻止 - 将无法发送消息。因此,在不干扰图表窗口功能的情况下,防止程序退出的唯一明智方法是启动您自己的事件循环。而这正是 Application.Run()
所做的。
(回应评论)
据我了解,FSharp.Charting
库旨在作为一种在屏幕上显示 图表的快捷方式,主要用例是探索数据集生活在 F# Interactive 中。更具体地说,Chart
对象的一些关键属性,例如 ChartAreas
和 Series
在创建图表时不会初始化,只有在屏幕上显示时才会初始化(请参阅 source code ),如果没有这些属性,图表将保持为空。
如果不向库提交拉取请求,我建议深入到底层 System.Windows.Forms.DataVisualization.Charting.Chart
:
open System.Windows.Forms.DataVisualization.Charting
let ch = new Chart()
ch.ChartAreas.Add( new ChartArea() )
let s = new Series( ChartType = SeriesChartType.Line )
s.Points.DataBind( [for x in 1..10 -> x, x*x], "Item1", "Item2", "" )
ch.Series.Add s;
ch.SaveImage(@"C:\Temp\chart.png", System.Drawing.Imaging.ImageFormat.Png)
关于f# - 如何在 fsi 中运行 .fsx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43968308/
我在桌面的“新文件夹”中有以下文件: // File location: "C:\Users\my_user_name\Desktop\New folder\AddOne.fs" // module
传入通知消息的 Android Studio logcat 显示如下 []message[]。 我复制并粘贴到 .txt 文件,它显示 FSImessagePDI 。 这种字符“FSI”和“PDI”是
我已经使用 Visual Studio Community Edition 安装了 F#,还安装了 Visual F# 4.0 Tools 当我从命令提示符运行 fsi 时抛出异常 我也尝试将 F#
我想编写一些运行一系列 F# 脚本 (.fsx) 的代码。问题是我可以拥有数百个脚本,如果我这样做: let shellExecute program args = let startInfo
例如,我错误地重新定义了ref。它取代了默认的 ref。 是否可以删除我的定义并在不重新启动的情况下恢复到原始定义? 最佳答案 let ref = Microsoft.FSharp.Core.Oper
例如,我错误地重新定义了ref。它取代了默认的 ref。 是否可以在不重启的情况下删除我的定义并恢复到原来的定义? 最佳答案 let ref = Microsoft.FSharp.Core.Opera
我读过 fsi.exe (F# Interactive) 不是严格意义上的真正“解释器”,因为它动态编译 F# 代码并显示其输出。 我的印象是“解释器”这个词适用于“动态”语言(即 JavaScrip
我有以下代码: let p = new System.Diagnostics.Process(); printfn "installing %A" "installing" p.StartInfo.F
如果我将下面的模块编译成一个dll namespace MyNs module SomeModule = do printfn "module loading" let x = 23
我在一台有 40 个内核的机器上有以下奇怪的行为:调用 System.Environment.ProcessorCount在fsi (12.0.30815.0) 和 fsianycpu (12.0.3
如何将 F# Interactive 控制台的输出限制为我自己的输出? 在我当前的设置中,fsi 在运行脚本时会写入大量信息(关于数据结构的类型和内容)。 我试过 quiet mode 没有成功。 谢
有什么方法可以检索 FSI session 中的开放命名空间和模块列表?我正在打印一个 F# 引用的表达式,我希望能够区分应该完全限定打印的模块值和不应该打印的模块值。 最佳答案 我不认为有办法做到这
我无法在F#签名文件中定义文字。 我有一个文件File.fs,如下所示: module Thingo = [] let hello = "world" 我需要为其创建一个签名文件,因此最初尝试
几天以来,我无法使用 FSharp Interactive interpreter(Alt + Enter),它给我这条消息:*未能生成 FSI,请确保它在 PATH 中* 此外,如果我运行脚本,它会
没有任何 SQLite .NET 包在 FSI 中工作,即使在 fs 项目中引用模块时也是如此。我试过 System.Data.SQLite,SQLitePCL.raw , 和 Microsoft.D
我正在 Mac OS X/mono 上使用 fsi 学习 F#,但很难知道退出和退出 shell 的命令。 退出,或者 ^D 不起作用,^C 也不起作用。停止 fsi 的命令是什么? 一般来说,在哪里
使用 FSharp.Charting 探索 F# 我原以为我会从一个简单的“hello world”开始,但它留给我的问题比代码行还多。 #load @"..\packages\FSharp.Char
FSI 能否很好地处理多模块/文件 F# 项目?考虑以下项目: 模块.fs: module Xyz let add x y = x + y 程序.fs: module Program open Xyz
我有一个现有的应用程序,我希望能够在其中拥有自己的 FSI session 。虽然不是标准的 FSI session ,但我希望能够使用来自我的应用程序的数据预先填充 FSI session 。 所以
我使用 fsharpi (fsi) 作为后台编译进程,使用 System.Diagnostics.Process 生成进程。我的 ProcessStartInfo 设置如下所示: let psi =
我是一名优秀的程序员,十分优秀!