【问题标题】:Confusion about setting column width in huxtable关于在 huxtable 中设置列​​宽的困惑
【发布时间】:2019-09-13 22:13:45
【问题描述】:

对于 R 包 huxtable 中的表如何设置列宽,我有点困惑。文档说,在对set_col_width 的调用中,参数value(如果为数字)将列宽指定为总宽度的比例(由set_width 设置)。但是,当我将表格写入 Word 时,value 的数字向量似乎改为指定绝对列宽(我实际上喜欢),显然以英寸为单位,而不管set_width 中设置的值如何。对于 pdf 输出,列宽规范似乎根本没有任何影响。

考虑以下示例。

library(dplyr)
library(huxtable)

test=data.frame(var1=1918:1925,var2=c(9009,1000:1006),var3 = 1100:1107)
HUX <- hux(test)

# add caption, borders, and colnames
HUX <- set_caption(HUX,"Example table") %>%
set_caption_pos("topleft") %>%
set_top_border(1,,1) %>%
set_bottom_border(final(1), , 1)    %>%
set_align(,,"left") %>%
add_colnames()
number_format(HUX)[,2:3] <- list(function(x) prettyNum(x, big.mark=","))

如果我设置列宽,它们会反映在 Word 输出中,而不是 pdf 输出中,但显然是绝对宽度,而不是比例宽度。

HUX <- set_width(HUX,1) %>%
    set_col_width(1:3, c(2,1,1))
quick_docx(HUX)  
quick_pdf(HUX)                                

file.remove(c("huxtable-output.pdf","huxtable-output.docx"))
HUX <- set_width(HUX,1) %>%
    set_col_width(1:3, c(2,3,1))
quick_docx(HUX)  
quick_pdf(HUX)                                

上面的代码改变了列宽(以及整个表格的宽度,尽管set_width 中设置的宽度没有改变),但只在Word 中,而不是在pdf 输出中。更改set_with中的参数在Word中没有效果,但确实会移动pdf中的表格(虽然表格本身的外观没有变化),大概是因为“表格绘图区域”更小,边缘因此移动,并且表格的位置在这个“区域”中是左对齐的。

file.remove(c("huxtable-output.pdf","huxtable-output.docx"))
HUX <- set_width(HUX,0.5) %>%
    set_col_width(1:3, c(2,3,1))
quick_docx(HUX)  
quick_pdf(HUX)                                

现在,当我尝试使用有效(我认为)LaTex 长度来指定列宽时,它对 pdf 没有任何影响,而且它实际上也没有为 Word 输出设置列宽。

file.remove(c("huxtable-output.pdf","huxtable-output.docx"))
HUX <- set_width(HUX,1) %>%
    set_col_width(1:3, paste0(c(2,3,1),"in"))
quick_docx(HUX)  
quick_pdf(HUX)                                

此外,现在,在尝试了 LaTex 长度规范后,之前确实成功设置 Word 输出的列宽的代码(上面)不再这样做了。

file.remove(c("huxtable-output.pdf","huxtable-output.docx"))
HUX <- set_width(HUX,1) %>%
    set_col_width(1:3, c(2,3,1))
quick_docx(HUX)  
quick_pdf(HUX)                                

如果我在这里遗漏了一些明显的东西,我深表歉意,但我似乎无法让这个列宽规范按我预期的方式工作。非常感谢任何可以为我解决这个问题的人。

最重要的是,我希望能够显式设置列宽,而不管表格的单元格内容如何(即列宽不会缩小到单元格内容的宽度),尤其是对于写出或编织成pdf。

让它适用于 Word 也很好,但顺便说一句,写入 Word 似乎不会保留表格标题(但我总是可以稍后在 Word 中添加标题)。

我正在使用huxtable 4.5.0。

【问题讨论】:

  • 请参阅?flextable::width,了解它在 Word 中的工作方式。请参阅 ?col_width 了解为什么 set_col_width(1:3, c(2,3,1)) 具有未定义的行为。试试set_col_width(1:3, c("2in", "3in", "1in"))……准备好尝试一下——col_width 的实现不是很令人满意。
  • 好的,谢谢。我做了一些实验(绝不是全面的),并在下面的答案中报告结果。但你是对的。 widthcol_width 有点挑剔。

标签: r pdf word column-width


【解决方案1】:

看来关键是要指定set_wrap(ht) &lt;- TRUE,然后set_col_width 对pdf 输出做出响应。但并不完全一致。当使用quick_pdf 生成pdf 时,像set_col_width(1:3, c(0.6,0.2,0.2)) 这样的数字规范失败,并产生错误:

! Illegal unit of measure (pt inserted).
<to be read again> 
                   !
l.108 \end{tabularx}
                    \end{threeparttable} 

Error: Failed to compile C:\Users\staufge\AppData\Local\Temp\Rtmp6p7GhF\file26983e8c25a6.tex. See https://yihui.name/tinytex/r/#debugging for debugging tips. See file26983e8c25a6.log for more info.

rmarkdown 编织时,相同的规范确实有效。 无论哪种方式,像set_col_width(1:3, paste0(c(3,2,4),"cm")) 这样的规范都运行良好,除了列宽比指定的宽度稍微宽一些(大约 3-4 毫米)。我虽然可能玩set_right_padding(或左)可能会使宽度规格准确,但它似乎没有任何效果。

此外,设置position(ht) &lt;- "center"(默认值)似乎不会显式居中表格,而是将width() 指定的“表格宽度”居中。表格本身似乎在该区域内左对齐。所以像这样的规范:

width(ht) <- 1
ht <- set_col_width(ht, 1:3, paste0(c(3,2,4),"cm"))

生成一个在整个文本宽度内左对齐的表格,而类似:

width(ht) <- 0.5
ht <- set_col_width(ht, 1:3, paste0(c(3,2,4),"cm"))

生成一个在文本区域宽度一半的居中区域内左对齐的表格(但表格本身并不完全居中)。

无论如何,我想我现在知道如何显式设置表格宽度,这就是我所追求的。

【讨论】:

  • 能不能报github编译失败?谢谢(包作者)
  • 好的,我刚刚在 GitHub 上发布了这个。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 2012-09-28
  • 2016-04-05
  • 2022-11-26
  • 2020-05-21
  • 1970-01-01
  • 2019-05-17
  • 2020-03-06
相关资源
最近更新 更多