F #, Deddle и R. Net: seq <'a> [] против массива IEnumerable - PullRequest
3 голосов
/ 18 марта 2020

Я пытаюсь преобразовать Фрейм Дидла в R DataFrame, используя R. Net.

Я пробовал 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 []. a3 - это то же самое, что и a2, единственное отличие заключается в «принудительной» подписи массива IEnumerable. Работает только a3, но способ создания a3 не подходит, так как я должен вставить все столбцы вручную.

Мои вопросы: 1) почему работает только a3 ?; 2) как я могу воссоздать a3 как a1, т. Е. Не знать заранее все существующие столбцы и иметь массив IEnumerable в качестве сигнатуры?

1 Ответ

4 голосов
/ 18 марта 2020

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
...