使用R中的Plumber重新发送HTML页面

时间:2018-03-13 12:56:53

标签: r

我知道管道工比完全成熟的网站更适合构建API,这说我试图在HTML中显示来自db(mongo)的动态数据。一切正常,但我使用的方式(很大程度上来自一个巨大的例子)可能不是最好的。以下是我的主页示例:

#' Return result
#' @get /
#' @serializer html

function(ht) {
  title <- "Title"
  body_intro <-  "Welcome to R.gift!"
  body_model <- paste("This is just a test ...page from the db with name <b>", single[1], "</b>")
  body_msg <- paste("the home page title is <b>", single[2] , "</b>",
                     "The home page content:<b>",
                     single[3], "</b>",
                     sep = "\n")


css <- ' <link href="https://cloud.typography.com/7/css/fonts.css" rel="stylesheet">'
about <- '<a href="pages/about">about page</a>'
contact <- '<a href="pages/contact">contact page</a>'

  result <- paste(
    "<head>",
    css,
    "</head>",
    "<html>",
    '<div style="font-family: Giant Background A, Giant Background B;font-style: normal;font-weight: 400;font-size:20pt;">',
    "<h1>", title, "</h1>",
    "<body>",
    body_intro, "</div>",
    '<div style="font-family: Gotham A, Gotham B;font-style: normal;font-weight: 400;font-size:16pt;">',
    "<p>", body_model, "</p>",
    "<p>", body_msg, "</p>",
    "<p>", about, "</p>",
    "<p>", contact, "</p>",
    "</div>",
    "</body>",
    "</html>",
    collapse = "\n"
  )

  return(result)
}

所以我的问题是,是否有一种更优雅的方式来实现相同的可能与半模板系统。解决方案可能很明显(我对R来说很新,所以请耐心等待)。我知道管道工可以使用

服务静态文件
#* @assets ./files/static
list()

但我认为这不允许我将变量传递给index.html吗?

理想情况是只使用任何模板系统中的标签。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

我的建议是取消服务器端渲染并在客户端完成所有工作。您可以使用像 vue 这样的前端库(如果您了解 HTML 和基本的 javascript,则可以使用 vue),然后向后端发出 GET 请求以获取您需要的数据。然后使用该数据自定义 UI。这种方法让 R 专注于数据,而前端专注于呈现。

答案 1 :(得分:0)

您可以尝试这样的事情:

basicHTML <- "The home page title is <b> %s </b> The home page content: <b> %s </b>" # create a template in a file or in the script.

single <- c(title = "Hello World", bodyMsg = "lorem ipsum") # set up your parameters.

finalHTML <- sprintf(basicHTML, single[1], single[2])

或许你对这种方法感到更舒服:https://shiny.rstudio.com/articles/templates.html

我希望这会对你有所帮助。