написание пользовательской функции с использованием expss :: cro () - PullRequest
2 голосов
/ 09 мая 2020

Я пытаюсь написать относительно простую пользовательскую функцию для вывода перекрестных таблиц, но не совсем уверен, почему она не работает.

Мои тестовые данные:

fp_within = structure(list(weight_cat.w1 = structure(c(1L, 2L, 2L, 1L, 1L, 
2L, 1L, 1L, 3L, 3L, 3L, 3L, NA, 3L, 3L, 2L, NA, NA, NA, NA), .Label = c("1", 
"2", "3"), label = "Weight (Wave 1)", class = c("labelled", "factor"
)), weight_cat.w2 = structure(c(1L, 2L, 2L, 1L, 1L, 2L, 1L, NA, 
2L, 3L, 3L, 2L, 1L, 3L, 3L, 2L, 2L, 2L, 3L, 1L), .Label = c("1", 
"2", "3"), label = "Weight (Wave 2)", class = c("labelled", "factor"
))), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"
))

Мой код:

library(expss)
library(tidyr)

xtable = function(wave1, wave2, name) {

  xtab = fp_within %>%
  tab_cells(wave1) %>% 
  tab_cols(wave2) %>% 
  tab_stat_cases() %>% # tab_stat_cases = counts
  tab_pivot() %>% 
  set_caption(glue("Table showing agreement in {name} across waves (N)"))

  return(xtab)

}

xtable(weight_cat.w1, weight_cat.w2, "weight")

Это вызывает ошибку, в которой говорится:

Error in eval(expr, envir = e, enclos = baseenv()) : 
  object 'weight_cat.w1' not found

Это работает вне функции, и я ожидаю вывода, например:

Table showing agreement in weight across waves (N)                                                                   
 |                 |              | Weight (Wave 2) |      |      |
 |                 |              |               1 |    2 |    3 |
 | --------------- | ------------ | --------------- | ---- | ---- |
 | Weight (Wave 1) |            1 |            1519 |  309 |    5 |
 |                 |            2 |             300 | 1229 |  299 |
 |                 |            3 |               6 |  278 | 1559 |
 |                 | #Total cases |            1825 | 1816 | 1863 |

1 Ответ

2 голосов
/ 09 мая 2020

Аргументы weight_cat.w1 и weight_cat.w2 оцениваются до того, как дойдет до tab_*. Поскольку таких переменных нет за пределами вашего набора данных, возникает ошибка. Чтобы избежать предварительной оценки, вам нужно позаботиться об этом, используя eval(substitute(...)):

xtable = function(wave1, wave2, name) {
    xtab = eval(substitute({
        fp_within %>%
            tab_cells(wave1) %>% 
            tab_cols(wave2) %>% 
            tab_stat_cases() %>% # tab_stat_cases = counts
            tab_pivot()%>% 
            set_caption(glue("Table showing agreement in {name} across waves (N)"))
    })) 

    return(xtab)

}

...