F#、Deddle 和 R.Net:seq<'a> [] 与 IEnumerable 数组
F#, Deddle and R.Net: seq<'a> [] vs. IEnumerable array
我正在尝试使用 R.Net 将 Deedle Frame 转换为 R DataFrame。
我尝试了 3 种不同的方法:
open RDotNet
REngine.SetEnvironmentVariables(@"C:\Program Files\R\R-3.6.3\bin\x64",@"C:\Program Files\R\R-3.6.3")
let engine = REngine.GetInstance()
//Deedle with columns x and y and with all the values as floats
let d = Frame.ReadCsv(@"C:\Users\flavi\Downloads\test.txt")
let a1 =
([],d.ColumnKeys)
||> Seq.fold (fun acc elem -> (d |> Frame.getCol elem |> Series.values |> Seq.map float)::acc) |> List.toArray
let a2 =
[|
d |> Frame.getCol "x" |> Series.values |> Seq.map float
d |> Frame.getCol "y" |> Series.values |> Seq.map float
|]
let (a3 : IEnumerable array) =
[|
d |> Frame.getCol "x" |> Series.values |> Seq.map float
d |> Frame.getCol "y" |> Series.values |> Seq.map float
|]
//only works with a3
let rFrame = engine.CreateDataFrame(a3,d.ColumnKeys |> Seq.map string |> Seq.toArray)
a1(我想用的那个)和 a2 有相同的签名:seq < float > []。
a3 与 a2 相同,唯一的区别是 IEnumerable 数组的“强制”签名。
只有 a3 有效,但是 a3 的创建方式不好,因为我必须手动插入所有列。
我的问题是:1) 为什么只有 a3 有效?; 2) 我怎样才能像 a1 一样重新创建 a3,即不必事先知道所有存在的列并将 IEnumerable 数组作为签名?
CreateDataFrame()要的是IEnumerable
的数组,但是a1是seq<float>
的数组,这是F#的说法IEnumerable<float>
;你只需要在里面加一个演员表。这为我编译(虽然我实际上 运行 它):
let a1 =
d.ColumnKeys
|> Seq.fold
(fun acc key ->
let values =
d
|> Frame.getCol key
|> Series.values
|> Seq.map unbox<float>
values::acc)
[]
|> Seq.map (fun floats -> floats :> IEnumerable)
|> Seq.toArray
我正在尝试使用 R.Net 将 Deedle Frame 转换为 R DataFrame。
我尝试了 3 种不同的方法:
open RDotNet
REngine.SetEnvironmentVariables(@"C:\Program Files\R\R-3.6.3\bin\x64",@"C:\Program Files\R\R-3.6.3")
let engine = REngine.GetInstance()
//Deedle with columns x and y and with all the values as floats
let d = Frame.ReadCsv(@"C:\Users\flavi\Downloads\test.txt")
let a1 =
([],d.ColumnKeys)
||> Seq.fold (fun acc elem -> (d |> Frame.getCol elem |> Series.values |> Seq.map float)::acc) |> List.toArray
let a2 =
[|
d |> Frame.getCol "x" |> Series.values |> Seq.map float
d |> Frame.getCol "y" |> Series.values |> Seq.map float
|]
let (a3 : IEnumerable array) =
[|
d |> Frame.getCol "x" |> Series.values |> Seq.map float
d |> Frame.getCol "y" |> Series.values |> Seq.map float
|]
//only works with a3
let rFrame = engine.CreateDataFrame(a3,d.ColumnKeys |> Seq.map string |> Seq.toArray)
a1(我想用的那个)和 a2 有相同的签名:seq < float > []。 a3 与 a2 相同,唯一的区别是 IEnumerable 数组的“强制”签名。 只有 a3 有效,但是 a3 的创建方式不好,因为我必须手动插入所有列。
我的问题是:1) 为什么只有 a3 有效?; 2) 我怎样才能像 a1 一样重新创建 a3,即不必事先知道所有存在的列并将 IEnumerable 数组作为签名?
CreateDataFrame()要的是IEnumerable
的数组,但是a1是seq<float>
的数组,这是F#的说法IEnumerable<float>
;你只需要在里面加一个演员表。这为我编译(虽然我实际上 运行 它):
let a1 =
d.ColumnKeys
|> Seq.fold
(fun acc key ->
let values =
d
|> Frame.getCol key
|> Series.values
|> Seq.map unbox<float>
values::acc)
[]
|> Seq.map (fun floats -> floats :> IEnumerable)
|> Seq.toArray