2015-01-19 2 views
1

Я хотел бы создать участок в Shiny, который пользователь может загрузить как pdf, используя специальный шрифт, указанный в качестве пользовательского ввода.Как использовать разные шрифты в R Shiny plot

Конкретно, я хотел бы использовать функцию pdf, такую ​​как pdf("plot.pdf", width = 5, height = 5, family = font.family), где значение font.family указано пользователем.

Вот простой пример: Если я запустил пример на своей машине, он отлично работает. Однако, когда он размещен на блестящих серверах RStudio, я получаю сообщение об ошибке, указывающее, что указанное семейство шрифтов не может быть найдено. Я думаю, проблема в том, что шрифты, которые я хочу, недоступны на блестящих серверах RStudio, но есть ли способ включить их?

server.R

shinyServer(function(input, output) { 

output$distPlot <- renderPlot({ 

plot(1, xlim = c(0, 1), ylim = c(0, 1)) 
text(.5, .5, "Custom Font!!" 
}) 

output$downloadPlot <- downloadHandler(

    filename = function() {paste('CustomFont.pdf')}, 
    content = function(file){ 

font.family <- input$font.family 

pdf(file, width = 11, height= 8.5, family = font.family) 

plot(1, xlim = c(0, 1), ylim = c(0, 1)) 
text(.5, .5, fonts(), cex = 10) 


dev.off() 
}, contentType = "image/pdf" 
) 
}) 

ui.R

shinyUI(fluidPage(

sidebarLayout(
sidebarPanel(
    selectInput("font.family", "Choose Font", 
       choices = c("Helvetica Neue", "Times New Roman", "Arial") 
), 
    downloadButton("downloadPlot", "Download Plot as PDF") 
), 

# Show a plot of the plot 
mainPanel(
    plotOutput("distPlot", width = "800px", height = "800px") 
)))) 
+1

Что код, который вы запускаете на локальном компьютере, что позволяет выбрать пользовательский шрифт для сюжета? Используете ли вы одну и ту же операционную систему на своей локальной машине и где вы размещаете приложение Shiny? – MrFlick

+0

сторона примечание: я думаю, вы должны взглянуть на 'pdfFonts', чтобы получить представление о наборе шрифтов, используемых' pdf'. Возможно, вы можете выполнить 'pdfFonts()' на сервере и сравнить то, что у вас есть локально. – agstudy

+0

@agstudy: Спасибо за подсказку pdfFonts()! Это позволяет мне видеть, какие шрифты доступны на сервере. Проблема в том, что есть некоторые шрифты (например, Helvetica Neue), которые я бы хотел использовать, но недоступны на сервере. Вы знаете, могу ли я загружать шрифты на сервер Shiny? –

ответ

0

Я имел a similar problem. Чтобы решить эту проблему, большая часть функции renderPlot() была воссоздана с помощью renderImage(), как описано в this Shiny tutorial article. Затем рендеринг шрифтов работал по желанию.

Это код, который разрешил этот вопрос; он также может решить эту проблему.

ui.R изменить

mainPanel(
    imageOutput("myImage") 
) 

server.R

shinyServer(function(input, output, session) { 

    # A dynamically-sized plot 
    output$myImage <- renderImage({ 
    # Read myImage's width and height. These are reactive values, so this 
    # expression will re-run whenever they change. 
    width <- session$clientData$output_myImage_width 
    height <- session$clientData$output_myImage_height 

    # For high-res displays, this will be greater than 1 
    pixelratio <- session$clientData$pixelratio 

    # A temp file to save the output. 
    outfile <- tempfile(fileext='.png') 

    # Generate the image file 
    png(outfile, width=width*pixelratio, height=height*pixelratio, 
     res=72*pixelratio) 
    plot(rnorm(100), rnorm(100), family="serif") 
    dev.off() 

    # Return a list containing the filename 
    list(src = outfile, 
     width = width, 
     height = height, 
     alt = "This is alternate text") 
    }, deleteFile = TRUE) # delete the temp file when finished 

}) 
Смежные вопросы