Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert html output to image

Tags:

html

output

r

image

I'm using R formattable package to render some data frames but the output is html ( it opens the browser after I run the script ).

The thing is I'm trying to render those tables under PowerBI which accepts R scripts but need the output to be an image (like a ggplot) not html. But I don't know how I can do it.

I've looked into R2HTML and htmlwidgets packages but I still didn't find a solution with those. ( I may have made some mistakes ).

Here is the dummy code I'm working with:

library(formattable)
DF <- data.frame(Ticker=c("", "", "", "IBM", "AAPL", "MSFT"),
             Name=c("Dow Jones", "S&P 500", "Technology", 
                    "IBM", "Apple", "Microsoft"),
             Value=accounting(c(15988.08, 1880.33, NA, 
                                130.00, 97.05, 50.99)),
             Change=percent(c(-0.0239, -0.0216, 0.021, 
                              -0.0219, -0.0248, -0.0399)))
DF
##   Ticker       Name     Value Change
## 1         Dow Jones 15,988.08 -2.39%
## 2           S&P 500  1,880.33 -2.16%
## 3        Technology        NA  2.10%
## 4    IBM        IBM    130.00 -2.19%
## 5   AAPL      Apple     97.05 -2.48%
## 6   MSFT  Microsoft     50.99 -3.99%
formattable(DF, list(
  Name=formatter(
"span",
style = x ~ ifelse(x == "Technology", 
                   style(font.weight = "bold"), NA)),
  Value = color_tile("white", "orange")
 Change = formatter(
"span",
style = x ~ style(color = ifelse(x < 0 , "red", "green")),
x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x))))
like image 275
Joe Avatar asked Jun 04 '26 10:06

Joe


1 Answers

formattable(DF, list(
  Name = formatter(
    "span", style = x ~ ifelse(x == "Technology",  style(font.weight = "bold"), NA)
  ),
  Value = color_tile("white", "orange"),
  Change = formatter(
    "span", style = x ~ style(color = ifelse(x < 0 , "red", "green")),
    x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x)))
) -> w

htmlwidgets::saveWidget(as.htmlwidget(w), "/some/dir/table.html", selfcontained = TRUE)

webshot::webshot(url = "/some/dir/table.html", file = "/some/dir/table.png", 
                 vwidth = 1000, vheight = 275)

enter image description here

The width/height is not necessarily going to come out precisely as what's specified and you'll need to do some manual guessing for it (or load up magick and see if you can auto-clip using it).

This relies on phantomjs and you may not be able to get your IT and/or security groups to enable the use of it.

like image 95
hrbrmstr Avatar answered Jun 08 '26 00:06

hrbrmstr



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!