使用RPy和xtable从R摘要生成LaTeX表

时间:2013-11-10 15:19:01

标签: python r rpy2 xtable

我在python中运行一些线性模型拟合(通过RPy使用R作为后端),我想用R“摘要”数据导出一些LaTeX表。

This thread很好地解释了如何在R中使用xtable函数),但我无法弄清楚如何在RPy中实现它。

唯一相关的搜索,如“Chunk RPy”或“xtable RPy”返回的是this,这似乎是在python中加载包但不使用它: - /

Here's an example我如何使用RPy以及会发生什么。

这可能是错误而无需加载任何数据:

from rpy2.robjects.packages import importr
xtable = importr('xtable')
latex = xtable('')

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-131-8b38f31b5bb9> in <module>()
----> 1 latex = xtable(res_sum)
  2 print latex

TypeError: 'SignatureTranslatedPackage' object is not callable

我尝试使用stargazer包而不是xtable,我收到同样的错误。

3 个答案:

答案 0 :(得分:1)

好的,我解决了,我有点惭愧地说这完全没问题。

您只需将这些功能称为xtable.xtable()stargazer.stargazer()

答案 1 :(得分:0)

为了从Python轻松生成TeX数据,我编写了以下函数;

import re


def tformat(txt, v):
    """Replace the variables between [] in raw text with the contents
    of the named variables. Between the [] there should be a variable name,
    a colon and a formatting specification. E.g. [smin:.2f] would give the
    value of the smin variable printed as a float with two decimal digits.

    :txt: The text to search for replacements
    :v: Dictionary to use for variables.
    :returns: The txt string with variables substituted by their formatted
    values.
    """
    rx = re.compile(r'\[(\w+)(\[\d+\])?:([^\]]+)\]')
    matches = rx.finditer(txt)
    for m in matches:
        nm, idx, fmt = m.groups()
        try:
            if idx:
                idx = int(idx[1:-1])
                r = format(v[nm][idx], fmt)
            else:
                r = format(v[nm], fmt)
            txt = txt.replace(m.group(0), r)
        except KeyError:
            raise ValueError('Variable "{}" not found'.format(nm))
    return txt

您可以在传递给此函数的文本中使用字典中的任何变量名称,并将其替换为该变量的格式化值。

我倾向于在Python中进行计算,然后将globals()函数的输出作为tformat的第二个参数传递:

smin = 235.0
smax = 580.0
lst = [0, 1, 2, 3, 4]
t = r'''The strength of the steel lies between SI{[smin:.0f]}{MPa} and \SI{[smax:.0f]}{MPa}. lst[2] = [lst[2]:d].'''
print tformat(t, globals())

随意使用它。我把它放在公共领域。

编辑:我不确定“线性模型适合”是什么意思,但可能numpy.polyfit在Python中做你想做的事情吗?

答案 2 :(得分:0)

要解决您的问题,请将stargazer更新为版本4.5.3,现在可在CRAN上使用。那么你的例子就应该完美无缺。