首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于在huxtable中设置列宽的混淆

关于在huxtable中设置列宽的混淆
EN

Stack Overflow用户
提问于 2019-04-24 14:55:38
回答 1查看 855关注 0票数 1

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

考虑下面的例子。

代码语言:javascript
复制
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=","))

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

代码语言:javascript
复制
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中移动了表(尽管表本身的外观没有变化),大概是因为“表格标绘区域”较小,因此边沿被移动,而表的位置在这个“区域”中是对的。

代码语言:javascript
复制
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没有什么影响,它实际上也没有为字输出设置列宽。

代码语言:javascript
复制
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长度规范之后,前面的代码(上面的代码)成功地为字输出设置了列宽,现在不再这样做了。

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2019-04-25 14:51:07

似乎关键是指定set_wrap(ht) <- TRUE,然后set_col_width响应于pdf输出。但并不是完全一致。当使用quick_pdf生成pdf时,像set_col_width(1:3, c(0.6,0.2,0.2))这样的数字规范失败了,并产生了一个错误:

代码语言:javascript
复制
! 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) <- "center" (默认)似乎没有显式地对表进行居中,而是以width()指定的“表宽”为中心。该表本身似乎在这一领域内是合理的。因此,这样的规范如下:

代码语言:javascript
复制
width(ht) <- 1
ht <- set_col_width(ht, 1:3, paste0(c(3, 2, 4), "cm"))

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

代码语言:javascript
复制
width(ht) <- 0.5
ht <- set_col_width(ht, 1:3, paste0(c(3, 2, 4), "cm"))

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55833023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档