Преобразование DataFrame в именованный список программно - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь использовать параметры форматирования в библиотеке Reactable в R. Я хотел бы создать форматирование программно из отображаемого фрейма данных.

Reactable Ожидает форматирования как

reactable(iris[1:5, ], columns = list(
  Sepal.Length = colDef(name = "Sepal Length"),
  Sepal.Width = colDef(name = "Sepal Width"),
  Species = colDef(align = "center")
))

Но у меня уже есть фрейм данных, который отображает фактические столбцы в столбцы отображения.

Есть ли способ преобразовать столбец сопоставления данных в именованный список. В отображаемом фрейме данных будет 2 столбца: исходный столбец и отображаемый столбец

. Я бы хотел расширить его, добавив дополнительные атрибуты. По мере того, как будет выглядеть дальнейшее форматирование столбцов,

percent = colDef(format = colFormat(percent = TRUE, digits = 1)). 

я мог бы просто добавить больше столбцов в мой фрейм данных.

Я пытался преобразовать в этот формат с использованием конкатенации строк, но это не сработало.

Пример кода с данными радужной оболочки, который у меня есть,

df <- iris
colnames(df) <- c('sep_l', 'sep_w','pet_l','pet_w','spec')
df$per <- df$sep_w/df$sep_l

col2 <- c('sep-l', 'sep-w', 'pet-l','pet-w', 'species', 'pct')

df_mapping <- cbind(colnames(df) , col2) %>% as.data.frame()
colnames(df_mapping) <- c('og','new')

df_mapping %<>%
 mutate(
  fmt = paste0(og, ' = colDef(format = colFormat(percent = TRUE, digits = 1))')
 )

reactable(df, columns = list(df_mapping$fmt))

1 Ответ

0 голосов
/ 12 апреля 2020

Здесь решение, использующее eval и parse, так как похоже, что вы хотели бы запустить выражение, используя текстовые блоки

library(reactable)
library(dplyr)
library(magrittr)

#get sample df
df <- iris
colnames(df) <- c('sep_l', 'sep_w','pet_l','pet_w','spec')
df$per <- df$sep_w/df$sep_l

col2 <- c('sep-l', 'sep-w', 'pet-l','pet-w', 'species', 'pct')

df_mapping <- cbind(colnames(df) , col2) %>% as.data.frame()
colnames(df_mapping) <- c('og','new')


# add character strings that will be used for the list command below (you forgot name== in your example)
df_mapping %<>%
  mutate(
    fmt = paste0(og,"= colDef(name='",paste(og),"'",",format = colFormat(percent = TRUE, digits = 1))"))



# paste the code together
text=paste0("list(",paste(df_mapping$fmt,collapse=","),")")

# use parse (returns the parsed, but unevaluated expression) and eval (will evaluate the parsed expression)
reactable(df, columns = eval(parse(text=text)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...