设置formattable()对象的宽度

时间:2016-03-10 16:54:24

标签: html r knitr r-markdown

我正在使用formattable包(AWESOME PACKAGE)对我已经网页抓取的数据表进行一些条件格式化。我想将结果对象与另一个formattable()表并排放在一个html文档中。但是,我无法弄清楚如何设置表格的宽度(在函数中或在knitr块中),以及如何将两个对象并排放置。

这是我的代码。我发现它很草率。有人可以帮我把两个相同的表并排放在.rmd编织到html中吗?它实际上是两个不同的formattable()表格,但它并不是真正重要的。

library(formattable, quietly = T)
library(rvest, quietly = T)



#Part 1: Air pollution forecast from sparetheair.org
#read the page
#0-50 Good Green
#51-100 Moderate Yellow
#101-150 Unhealthy for Sensitive Groups Orange
#151-200 Unhealthy  Red
#201-300 Very Unhealthy Purple --> Also red for simplicity
air_quality <- read_html("http://sparetheair.org/stay-informed/todays-     air-quality/five-day-forecast")
#Scrape table
box <- html_nodes(air_quality,"div div .f5day")
content <- html_text(box)
#Text cleaning, removing artifacts
fulltext <- gsub("\n"," ",content)
fulltext1 <- gsub("\n"," ",fulltext)
fulltext2 <- gsub("\r"," ", fulltext1)
fulltext3 <- gsub("\t"," ", fulltext2)
#split the string into a character vector of strings
mytext <- unlist(strsplit(fulltext3," "))
#Leave empty spaces out, 
wholething <- mytext[mytext != ""]
#vector of days
Days <- wholething[1:5]
#character data for table construction
wholedata <- wholething[6:69]
#a subset of Oakland related data
baydata <- wholedata[13:26]  
#convert to data frame exactly as it is on website
mydf <- data.frame(rbind(baydata[5:9], baydata[10:14]),    row.names=c("AQI","PMI"))
#transposed data frame (tidy data, observations in rows, variables in cols)
tmydf <- data.frame(cbind(Days, baydata[5:9], baydata[10:14]), row.names = NULL, stringsAsFactors = F)
#replace the names of the new df with the webscraped days of the week
names(tmydf) <- c("Day","AQI","PMI")
tmydf$PMI <- gsub("PM","",tmydf$PMI)
#Print to an html table the resulting dataframe
#eventually this will have some color coding or reactive element
#focus only on numeric variables
smaller <- tmydf[1:2,]
#Coerce to numeric
smaller$AQI <- as.numeric(smaller$AQI)
smaller$PMI <- as.numeric(smaller$PMI)
#Format ouput based on scale above
nicetable <- formattable(smaller, 
                         list( 
                             AQI = formatter("span", style = x ~ 
                                                 ifelse(x <= 50, style(display = "block",`border-radius` = "4px",
                                                                       padding = "0 4px",background = "green", 
                                                                       color = "white", font.weight = "bold"), 
                                                        ifelse(x <= 100, style(display = "block",`border-radius` = "4px",
                                                                               padding = "0 4px", background = "yellow", 
                                                                               color ="white", font.weight = "bold"), 
                                                               style(display = "block",`border-radius` = "4px",
                                                                     padding = "0 4px",background = "red", 
                                                                     color = "white", font.weight = "bold") ) ) ), 
                             PMI = formatter("span",style = x ~ 
                                                 ifelse(x == 2.5, style(display = "block",`border-radius` = "4px",
                                                                        padding = "0 4px",background = "red", 
                                                                        color = "white", font.weight = "bold"), 
                                                        style(display = "block",`border-radius` = "4px",
                                                              padding = "0 4px",background = "green", 
                                                              color = "white", font.weight = "bold") ) )
                         )
)

nicetable

GithubRepo

1 个答案:

答案 0 :(得分:1)

我会尝试在代码中解释,但要指定宽度,我们只需要formattable手动将htmlwidget转换为as.htmlwidget() rmarkdown。这也适用于library(formattable, quietly = T) library(rvest, quietly = T) #Part 1: Air pollution forecast from sparetheair.org #read the page #0-50 Good Green #51-100 Moderate Yellow #101-150 Unhealthy for Sensitive Groups Orange #151-200 Unhealthy Red #201-300 Very Unhealthy Purple --> Also red for simplicity air_quality <- read_html("http://sparetheair.org/stay-informed/todays-air-quality/five-day-forecast") #Scrape table box <- html_nodes(air_quality,xpath="//div//div[contains(@class, 'f5day')]") content <- html_text(box) #Text cleaning, removing artifacts fulltext <- gsub("\n"," ",content) fulltext1 <- gsub("\n"," ",fulltext) fulltext2 <- gsub("\r"," ", fulltext1) fulltext3 <- gsub("\t"," ", fulltext2) #split the string into a character vector of strings mytext <- unlist(strsplit(fulltext3," ")) #Leave empty spaces out, wholething <- mytext[mytext != ""] #vector of days Days <- wholething[1:5] #character data for table construction wholedata <- wholething[6:69] #a subset of Oakland related data baydata <- wholedata[13:26] #convert to data frame exactly as it is on website mydf <- data.frame(rbind(baydata[5:9], baydata[10:14]), row.names=c("AQI","PMI")) #transposed data frame (tidy data, observations in rows, variables in cols) tmydf <- data.frame(cbind(Days, baydata[5:9], baydata[10:14]), row.names = NULL, stringsAsFactors = F) #replace the names of the new df with the webscraped days of the week names(tmydf) <- c("Day","AQI","PMI") tmydf$PMI <- gsub("PM","",tmydf$PMI) #Print to an html table the resulting dataframe #eventually this will have some color coding or reactive element #focus only on numeric variables smaller <- tmydf[1:2,] #Coerce to numeric smaller$AQI <- as.numeric(smaller$AQI) smaller$PMI <- as.numeric(smaller$PMI) #Format ouput based on scale above nicetable <- formattable(smaller, list( AQI = formatter("span", style = x ~ ifelse(x <= 50, style(display = "block",`border-radius` = "4px", padding = "0 4px",background = "green", color = "white", font.weight = "bold"), ifelse(x <= 100, style(display = "block",`border-radius` = "4px", padding = "0 4px", background = "yellow", color ="white", font.weight = "bold"), style(display = "block",`border-radius` = "4px", padding = "0 4px",background = "red", color = "white", font.weight = "bold") ) ) ), PMI = formatter("span",style = x ~ ifelse(x == 2.5, style(display = "block",`border-radius` = "4px", padding = "0 4px",background = "red", color = "white", font.weight = "bold"), style(display = "block",`border-radius` = "4px", padding = "0 4px",background = "green", color = "white", font.weight = "bold") ) ) ) ) nicetable # so what happens is a formattable object # gets converted to an htmlwidget # for viewing when interactive # to specify a width # we have to do the htmlwidget conversion ourselves # with as.htmlwidget as.htmlwidget(nicetable, width=200) # just use shiny to get helper fluid functions library(shiny) library(htmltools) browsable( tagList( fluidRow( column( width = 6, as.htmlwidget(nicetable) ), column( width = 6, as.htmlwidget(nicetable) ) ) ) )

statusFilter