Как использовать словарь и DataFrame с рендерингом Mustache.jl на языке Julia? - PullRequest
0 голосов
/ 05 ноября 2018

Я генерирую файлы TeX с использованием шаблона и отрисовываю этот шаблон с помощью Mustache.

Во-первых, у меня есть данные в фрейме данных:

Row │ label │ score │ max   │
│     │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1   │ 1     │ 2     │ 4     │
│ 2   │ 2     │ 3     │ 5     │
│ 3   │ 3     │ 4     │ 6     │
│ 4   │ 4     │ 5     │ 7     │

и словарь:

student = Dict( "name" => "John", "surname" => "Smith");

Я хочу сделать шаблон таким образом, чтобы в шаблоне были заменены переменные словаря и переменные DataFrame. Можно использовать словарь или DataFrame, но не оба одновременно.

Например, рендер работает в DataFrame только с шаблоном 'tmpl', показанным ниже:

tmpl = """

Your marks are:
\\begin{itemize}
  {{#:D}}
    \\item Mark for question {{:label}} is {{:score}} out of {{:max}}
  {{/:D}}
"""
rendered_marks = render(tmpl, D=df );

Однако, когда я добавляю переменные, такие как: name или: фамилия из словаря 'student', я получаю сообщения об ошибках:

marks_tmpl = """
Hello \\textbf{ {{:name}}, {{:surname}} }

Your marks are:
\\begin{itemize}
  {{#:D}}
    \\item Mark for question {{:label}} is {{:score}} out of {{:max}}
  {{/:D}}
\\end{itemize}

\\end{document}
"""
rendered_marks = render(tmpl, student, D=df );

Как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Чтобы добавить к ответу, вы могли бы также использовать итерацию для доступа к ключам в словаре или альтернативно назвать кортеж:

tmpl = """
Hello {{#:E}}\\textbf{ {{:name}}, {{:surname}} }{{/:E}}

Your marks are:
\\begin{itemize}
  {{#:D}}
    \\item Mark for question {{:label}} is {{:score}} out of {{:max}}
  {{/:D}}
\\end{itemize}

\\end{document}
"""

using Mustache
using DataFrames

student = Dict( "name" => "John", "surname" => "Smith");
D = DataFrame(label=[1,2], score=[80,90])

Mustache.render(tmpl, E=(name="John",surname="Doe"),D=D, max=100)
0 голосов
/ 05 ноября 2018

Вам не разрешено смешивать Dict и аргументы ключевых слов. Проще всего добавить DataFrame в словарь.

Сначала создайте DataFrame:

df = DataFrame(label=1:4, score=2:5, max=4:7)
4×3 DataFrame
│ Row │ label │ score │ max   │
│     │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1   │ 1     │ 2     │ 4     │
│ 2   │ 2     │ 3     │ 5     │
│ 3   │ 3     │ 4     │ 6     │
│ 4   │ 4     │ 5     │ 7     │

Далее, укажите ваш DataFrame в словаре для рендеринга Mustache.jl:

student = Dict( "name" => "John", "surname" => "Smith", "df" => df);

marks_tmpl = """
Hello \\textbf{ {{name}}, {{surname}} }

Your marks are:
\\begin{itemize}
{{#df}}
      \\item Mark for question {{:label}} is {{:score}} out of {{:max}}
{{/df}}
\\end{itemize}
"""

Таким образом, отображаются словарь и переменные DataFrame:

julia> println(render(marks_tmpl, student))

Hello \textbf{ John, Smith }

Your marks are:
\begin{itemize}
      \item Mark for question 1 is 2 out of 4
      \item Mark for question 2 is 3 out of 5
      \item Mark for question 3 is 4 out of 6
      \item Mark for question 4 is 5 out of 7
\end{itemize}

Полагаю, это то, что вы хотели?

...