Julia:将结果导出到 table:示例代码

Julia: Export results to table: example code

请指出示例代码和文档,以了解如何将一些数据和模拟结果导出为整洁、可读的 table,可以轻松复制粘贴或导入到文档中,特别是 post -使用 LaTeX 进行处理。

我目前的做法是:

using DataFrames
function show_table(mp::ModelParameters, ms::ModelSolution)
    α = mp.α; δ = ms.δ;
    d = DataFrame(Name = @data(["α"]),
                  Description = @data(["alpha"]),
                  Value = @data([α])
    )
    push!(d, @data(["δ", "delta", δ]))
    return(d)
end

    2×3 DataFrames.DataFrame
    │ Row │ Name │ Description │ Value │
    ├─────┼──────┼─────────────┼───────┤
    │ 1   │ "α"  │ "alpha"     │ 1.01  │
    │ 2   │ "δ"  │ "delta"     │ 2.02  │

将上面的内容变成 LaTeX table 需要一些工作。朝正确方向迈出的任何一步都将受到赞赏。

我为 R 找到了一个名为 LaTeX.jl that does not seem to be maintained and/or has been superseded. The dream would be to have something like stargazer 的很有前途的软件包。

我在我的代码中使用了 unicode 希腊字母,例如α,可以用 XeLaTeX 编译,但也欢迎将 α 转换为 \alpha 的解决方案。另一种方法是手动替换我的便利函数 show_table 中的名称,这还不错。

可能有也可能没有通常 导出乳胶 table 的好包。我在上面的评论中所说的是,根据我的经验,对于任何 严肃的 文档,您的乳胶 table 将很复杂并且最好单独处理(有些可能例如有多列,其他人可能没有,其他人可能需要自定义间距等)。因此,让 julia 脚本生成那些 table 可能是值得的,即每个 table 一个脚本。这使您能够在编译最终的乳胶文档时将这部分作为您的 makefile 的一部分。

例如,使用您提供的示例数据框:

%% main.tex -- example bare-bones document illustrating how 
 %             to import externally generated tables, without
 %             affecting the structure of your main document
 %             when those external tables get updated / replaced

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[table]{xcolor}
\begin{document}
  \begin{table}[htbp]
    \centering
    \input{./table1}        % I.e. simply dump julia-generated table here           
    \caption{This table was generated in Julia}
    \label{tbl:table1}
  \end{table}
\end{document}

### table1.jl script
  T[:,:Name] = "$\" * T[:,:Description] * "$";  # replace symbol with latex math

# Generate table header
  Table  = "\begin{tabular}{| " * "c |" ^ (ncol(T)+1) * "}\n";
  Table *= "    \hline\n";
  Table *= "    % Table header\n";
  Table *= "    \rowcolor[gray]{0.9}\n";
  Table *= "  Row"; for i in 1:ncol(T); Table *= " & " * string(names(T)[i]); end; Table *= " \\\n";

# Generate table body (with nice alternating row colours)
  toggleRowColour(x) = x == "0.8" ? "0.7" : "0.8";
  rowcolour = toggleRowColour(0.7);

  Table *= "    % Table body\n";
  for row in 1 : nrow(T)
    Table *= "  \rowcolor[gray]{" * (rowcolour = toggleRowColour(rowcolour); rowcolour) * "}\n";
    Table *= "  " * string(row); for col in 1 : ncol(T) Table *= " & " * string(T[row,col]); end; Table *= " \\\n";
    Table *= "  \hline\n"; 
  end
  Table *= "\end{tabular}\n";

# Export result to .tex file
  write("table1.tex", Table);

在你的 julia REPL 中:

julia> using DataFrames
julia> # function show_table defined as above ...
julia> T = show_table(1.01,2.02);
julia> include("table1.jl")

生成以下 table1.tex 文件:

\begin{tabular}{| c |c |c |c |}
  \hline
  % Table header
  \rowcolor[gray]{0.9}
  Row & Name & Description & Value \
  % Table body
  \rowcolor[gray]{0.7}
  1 & $\alpha$ & alpha & 1.01 \
  \hline
  \rowcolor[gray]{0.8}
  2 & $\delta$ & delta & 2.02 \
  \hline
\end{tabular}

编译生成的 main.tex 文件给出:

现在,我想弄清楚我在这里说的是什么。我并不是说这是最通用、最自动化的 julia 方法。恰恰相反。这是高度特定于您的文件。我 am 说的是,保留一个简单的 julia 脚本模板来生成像这样的 tables,这对你的项目来说是 suitable,并针对每个特定的项目调整它您需要的 latex table,在撰写论文或类似文档的上下文中可能会更加直接,您可能需要对 table 进行大量微调和控制从长远来看。

因此,在您编写第一个 table 并将其作为模板后,这种方法对于后续的 table 来说很快,因为您只是在这里和那里进行奇怪的调整,同时仍然使您能够在新数据出现时更新您的 tables,并允许您在更广泛的 Latex Makefile 编译序列中自动编译 julia 生成的 tables。

这是我在自己的论文中遵循的方法,它为我节省了 很多 的时间。

请注意 DataTables.jl 中存在 LaTeX 导出:

julia> using DataTables

julia> dt = DataTable(Fish = ["Suzy", "Amir"], Mass = [1.5, 2])
2×2 DataTables.DataTable
│ Row │ Fish │ Mass │
├─────┼──────┼──────┤
│ 1   │ Suzy │ 1.5  │
│ 2   │ Amir │ 2.0  │

julia> reprmime("text/latex", dt)
"\begin{tabular}{r|cc}\n\t& Fish & Mass\\\n\t\hline\n\t1 & Suzy &     1.5 \\\n\t2 & Amir & 2.0 \\\n\end{tabular}\n"

它可以很容易地反向移植到 DataFrames。

这是一个包裹:

https://github.com/jmboehm/RegressionTables.jl

我同意 OP 的观点,即有一个快速的解决方案来输出回归结果是很有用的。我可能想在项目的某个阶段花一个小时构建一个自定义 table,但对于初学者和快速共享结果,Julia 的 stargazer(这是该软件包的目标)是理想的。