如何从组织模式的源代码块中 return 多个乳胶或组织表?
How to return multiple latex or org tables from an org-mode's source block?
我的具体问题是,很多时候我在 org-mode 中使用 python 源块来 运行 对数据帧的许多变量进行相同的统计分析,然后将它们呈现为乳胶 tables。手动进行每个分析变得非常乏味,所以我想使用 for 循环:
#+begin_src python :exports results :session :results latex
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
'b': [9, 8, 7, 6, 5]})
for var in df.columns:
df[var].value_counts().to_latex()
#+end_src
问题是它只 return 由源块编辑的最后一个值 return(for 循环的最后 运行。
#+Results:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
那么有没有办法从一个源代码块中实际获得多个乳胶或组织table?
编辑:
考虑@dschwilk 的回答,我需要的是 return 多个 #+Results 块(每个 latex 或 org table 一个块),以便我可以在它们之间添加文本描述。如:
Description for table 1
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & a \
\midrule
5 & 1 \
4 & 1 \
3 & 1 \
2 & 1 \
1 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
Description for table 2
#+RESULTS:
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
在 python 中创建您想要的文本输出行得通吗?例如,收集生成的 LaTeX 并添加 \table{}
和 \caption
:
#+begin_src python :exports results :session :results latex
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
'b': [9, 8, 7, 6, 5]})
var_dict = {}
for var in df.columns:
var_dict[var] = df[var].value_counts().to_latex()
res = '\n'.join(['\begin{table}\n\caption{Variable: %s} \n\n %s\n\end{table}' % (key, value) for (key, value) in var_dict.items()])
res
#+end_src
#+results:
#+BEGIN_EXPORT latex
\begin{table}
\caption{Variable: a}
\begin{tabular}{lr}
\toprule
{} & a \
\midrule
5 & 1 \
4 & 1 \
3 & 1 \
2 & 1 \
1 & 1 \
\bottomrule
\end{tabular}
\end{table}
\begin{table}
\caption{Variable: b}
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
\end{table}
#+END_EXPORT
您可以创建一个列表并在每个循环中将乳胶输出附加到它:
latex_list=[]
for var in df.columns:
latex_list.append(df[var].value_counts().to_latex())
也许这样打印:
for e in latex_list:
print(e)
我设法得到接近我想要的东西,但我必须 运行 多个 src_blocks(我真的很想避免)。
我有一个源代码块,它创建所有 table 并将它们存储在一个列表中,并为每个 table 和 return 创建一个新的 src_block。
例如:
#+begin_src python :exports results :session :results silent)
import pandas as pd
results_tables = []
d = pd.DataFrame({'a': [1, 2, 3, 4, 5],
'b': [9, 8, 7, 6, 5]})
for var in d.columns:
results_tables.append(d[var].value_counts().to_latex())
#+end_src
#+RESULTS:
#+begin_src python :exports results :session :results latex
results_tables[0]
#+end_src
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & a \
\midrule
5 & 1 \
4 & 1 \
3 & 1 \
2 & 1 \
1 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
#+begin_src python :exports results :session :results latex
results_tables[1]
#+end_src
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
我的具体问题是,很多时候我在 org-mode 中使用 python 源块来 运行 对数据帧的许多变量进行相同的统计分析,然后将它们呈现为乳胶 tables。手动进行每个分析变得非常乏味,所以我想使用 for 循环:
#+begin_src python :exports results :session :results latex
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
'b': [9, 8, 7, 6, 5]})
for var in df.columns:
df[var].value_counts().to_latex()
#+end_src
问题是它只 return 由源块编辑的最后一个值 return(for 循环的最后 运行。
#+Results:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
那么有没有办法从一个源代码块中实际获得多个乳胶或组织table?
编辑: 考虑@dschwilk 的回答,我需要的是 return 多个 #+Results 块(每个 latex 或 org table 一个块),以便我可以在它们之间添加文本描述。如:
Description for table 1
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & a \
\midrule
5 & 1 \
4 & 1 \
3 & 1 \
2 & 1 \
1 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
Description for table 2
#+RESULTS:
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
在 python 中创建您想要的文本输出行得通吗?例如,收集生成的 LaTeX 并添加 \table{}
和 \caption
:
#+begin_src python :exports results :session :results latex
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
'b': [9, 8, 7, 6, 5]})
var_dict = {}
for var in df.columns:
var_dict[var] = df[var].value_counts().to_latex()
res = '\n'.join(['\begin{table}\n\caption{Variable: %s} \n\n %s\n\end{table}' % (key, value) for (key, value) in var_dict.items()])
res
#+end_src
#+results:
#+BEGIN_EXPORT latex
\begin{table}
\caption{Variable: a}
\begin{tabular}{lr}
\toprule
{} & a \
\midrule
5 & 1 \
4 & 1 \
3 & 1 \
2 & 1 \
1 & 1 \
\bottomrule
\end{tabular}
\end{table}
\begin{table}
\caption{Variable: b}
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
\end{table}
#+END_EXPORT
您可以创建一个列表并在每个循环中将乳胶输出附加到它:
latex_list=[]
for var in df.columns:
latex_list.append(df[var].value_counts().to_latex())
也许这样打印:
for e in latex_list:
print(e)
我设法得到接近我想要的东西,但我必须 运行 多个 src_blocks(我真的很想避免)。
我有一个源代码块,它创建所有 table 并将它们存储在一个列表中,并为每个 table 和 return 创建一个新的 src_block。
例如:
#+begin_src python :exports results :session :results silent)
import pandas as pd
results_tables = []
d = pd.DataFrame({'a': [1, 2, 3, 4, 5],
'b': [9, 8, 7, 6, 5]})
for var in d.columns:
results_tables.append(d[var].value_counts().to_latex())
#+end_src
#+RESULTS:
#+begin_src python :exports results :session :results latex
results_tables[0]
#+end_src
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & a \
\midrule
5 & 1 \
4 & 1 \
3 & 1 \
2 & 1 \
1 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX
#+begin_src python :exports results :session :results latex
results_tables[1]
#+end_src
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} & b \
\midrule
7 & 1 \
6 & 1 \
5 & 1 \
9 & 1 \
8 & 1 \
\bottomrule
\end{tabular}
#+END_LaTeX