You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言expss封装多响应交叉表函数传参报错解决

expss多选题交叉表自定义函数报错解决

正常运行的基础代码

用expss制作同时展示频数、占比的多选题交叉表,直接运行以下代码就能得到符合预期的结果:

library(expss)
set.seed(1998)
expss_output_viewer()
# 构造示例数据集
x <- c("A","B","C")
area <-  rep(x,each = 10)
p <-  sample(c(0,1),30,replace = T)
q <-  sample(c(0,1),30,replace = T)
r <-  sample(c(0,1),30,replace = T)
mrdata <-  data.frame(area,p,q,r)
# 生成交叉表
mrdata %>%
  tab_significance_options(keep = "none", sig_labels = NULL, subtable_marks = "greater", mode = "append") %>%
  tab_cols(total(), mdset(p,q,r)) %>%
  tab_cells(area) %>%
  tab_stat_cases(label = "cases") %>%
  tab_stat_cpct_responses(label = "%",total_row_position = "none") %>% 
  tab_pivot(stat_position = "inside_columns") %>% set_caption("Table 1")

初始封装的报错问题

单张表的代码量偏大,把制表逻辑封装成自定义函数可以精简代码、提升制表效率,最初的封装写法如下:

mrtable <-  function(input,rowvar,colvars,capt ="Table 1") {
  input %>%
    tab_significance_options(keep = "none", sig_labels = NULL, subtable_marks = "greater", mode = "append") %>%
    tab_cols(total(), mdset(colvars)) %>%
    tab_cells(rowvar) %>%
    tab_stat_cases(label = "cases") %>%
    tab_stat_cpct_responses(label = "%",total_row_position = "none") %>% 
    tab_pivot(stat_position = "inside_columns") %>% set_caption(capt)
}
mrtable(input = mrdata,colvars = c(p,q,r),rowvar = area)

运行上述代码会返回报错:

Error: 'cro': all variables should be of the same length or length 1.

报错原因

expss的mdset()函数要求直接传入多个独立的多选二分变量作为参数,不支持传入用c()合并后的单向量参数。初始封装时把p、q、r三个多选变量用c()拼接成单个对象传给mdset(colvars),函数无法正确拆分识别每个独立变量,做变量长度校验时就会触发上述报错。

可行的封装方案

用R的...动态参数透传多个多选变量,不需要提前合并变量,直接把传入的动态参数交给mdset()处理即可正常运行,代码如下:

mrtable <-  function(input,rowvar,...,capt ="Table 1") {
  input %>%
    tab_significance_options(keep = "none", sig_labels = NULL, subtable_marks = "greater", mode = "append") %>%
    tab_cols(total(), mdset(...)) %>%
    tab_cells(rowvar) %>%
    tab_stat_cases(label = "cases") %>%
    tab_stat_cpct_responses(label = "%",total_row_position = "none") %>% 
    tab_pivot(stat_position = "inside_columns") %>% set_caption(capt)
}
# 函数调用示例
mrtable(input = mrdata,rowvar = area,p,q,r,capt = "Tab")

内容的提问来源于stack exchange,提问作者Ahmad Noman Alnoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:15:39