Используйте flextable::display() в функции
Я пытаюсь использовать flextable::display()
функция изнутри функции, используя аргументы функции из отображения. Ниже моя функция:
add_footnote <- function(df, col, pattern, symbol){
tmp <- df
pat <- paste0(pattern, " {{x}}")
tmp <- display(tmp,
col_key = col,
i = ~ col == pattern,
pattern = pat,
formatters = list(x ~ as.character(symbol)),
fprops = list(x = fp_text(vertical.align = 'superscript')) )
return(tmp)
}
# Call function
df <- regulartable(head(iris))
add_footnote(df, col = 'Species', pattern = 'setosa', symbol = 'a')
Я надеюсь получить верхний индекс a
где бы setosa
появляется в Species
столбец, однако он дает следующую ошибку, указывающую, что функция отображения не может видеть аргументы, передаваемые в функцию:
Ошибка в eval(as.call(f[[2]]), envir = data): объект 'pattern' не найден
Кто-нибудь знает, как получить аргументы от функции, которая будет распознана внутренним display()
функционировать?
1 ответ
Решение
Функция display
довольно сложно использовать - вот почему я написал flextable::compose
, Он может опираться на аккуратный синтаксис eval. Ниже приведены 2 примера, которые должны вам помочь:
library(flextable)
library(officer)
library(rlang)
add_footnote_with_rlang <- function(df, col, pattern, symbol){
form_ <- sprintf("~ %s == '%s'", col, pattern)
colname <- enquo(col)
flextable::compose(
x = df, j = col, i = as.formula(form_),
value = as_paragraph(
as_chunk(!!colname),
as_chunk(symbol, props = fp_text(vertical.align = 'superscript')))
)
}
add_footnote <- function(df, col, pattern, symbol){
form_ <- sprintf("~ %s == '%s'", col, pattern)
flextable::compose(
x = df, j = col, i = as.formula(form_),
value = as_paragraph(
as_chunk(symbol, props = fp_text(vertical.align = 'superscript')))
)
}
# Call function
df <- regulartable(head(iris))
# df <- add_footnote(df, col = 'Species', pattern = 'setosa', symbol = 'a')
df <- add_footnote_with_rlang(df, col = 'Species', pattern = 'setosa', symbol = 'a')
df