标签: htmltools

R:如何优雅地将代码逻辑与 UI/html-tags 分开?

问题

在动态创建 ui 元素 ( shiny.tag, shiny.tag.list, ...) 时,我经常发现很难将它与我的代码逻辑分开,并且通常最终会出现一堆令人费解的嵌套tags$div(...),混合了循环和条件语句。虽然看起来令人讨厌和丑陋,但它也容易出错,例如在更改 html 模板时。

可重现的例子

假设我有以下数据结构:

my_data <- list(
  container_a = list(
    color = "orange",
    height = 100,
    content = list(
      vec_a = c(type = "p", value = "impeach"),
      vec_b = c(type = "h1", value = "orange")
    )
  ),
  container_b = list(
    color = "yellow",
    height = 50,
    content = list(
      vec_a = c(type = "p", value = "tool")
    )
  )  
)
Run Code Online (Sandbox Code Playgroud)

如果我现在想将此结构推送到 ui-tags 中,我通常会得到如下结果:

library(shiny)

my_ui <- tagList( …
Run Code Online (Sandbox Code Playgroud)

r templating shiny htmltools

9
推荐指数
1
解决办法
719
查看次数

要写入的文本必须是长度为一的字符向量

安装新版本的 Shiny (1.4.0) 包后,我遇到一个奇怪的错误消息

> Warning: Error in writeImpl: Text to be written must be a length-one
> character vector   [No stack trace available]
Run Code Online (Sandbox Code Playgroud)

我真的不明白有什么变化?以及如何解决这个问题?

任何想法将不胜感激!

跟踪如下所示:

13: execCallbacks(timeoutSecs, all, loop$id)
12: force(expr)
11: with_loop(loop, invisible(execCallbacks(timeoutSecs, all, loop$id)))
10: run_now(timeoutMs/1000, all = FALSE)
9: service(timeout)
8: serviceApp()
7: ..stacktracefloor..(serviceApp())
6: withCallingHandlers(expr, error = doCaptureStack)
5: domain$wrapSync(expr)
4: promises::with_promise_domain(createStackTracePromiseDomain(), 
       expr)
3: captureStackTraces({
       while (!.globals$stopped) {
           ..stacktracefloor..(serviceApp())
       }
   })
2: ..stacktraceoff..(captureStackTraces({
       while (!.globals$stopped) {
           ..stacktracefloor..(serviceApp())
       }
   }))
1: runApp("Projects/Bomboleo")

No traceback available 
Run Code Online (Sandbox Code Playgroud)

r shiny htmltools

8
推荐指数
1
解决办法
9500
查看次数

保存为网页时如何为 networkD3 可视化添加标题?

我使用以下代码创建了一个交互式可视化:

library(networkD3)

nodes = data.frame("name" = c("node1", "node2","node3", "node4", "node5", "node6", "node7"))
links = as.data.frame(matrix(c(
0,1,7937,
0,2,6990,
0,3,2483,
1,4,2120,
2,4,666,
3,4,282,
1,5,4583,
2,5,5657,
3,5,731,
1,6,1234,
2,6,756,
3,6,1470), byrow = TRUE, ncol = 3))

names(links) = c("source", "target", "value")

sankey <- sankeyNetwork(Links = links, Nodes = nodes,
          Source = "source", Target = "target",
          Value = "value", NodeID = "name",
          fontSize= 12, nodeWidth = 15)'
Run Code Online (Sandbox Code Playgroud)

这是我第一次使用 networkD3 包(或任何与此相关的交互式包),并且通过玩弄我发现为了保持它的交互性,它必须作为网页发布(或者有其他方式吗??)但是查看包的文档我看不到添加标题或标题/评论的方法。我想分享这一轮工作,所以需要在发布的网页上解释每个级别的理想含义

r networkd3 htmlwidgets htmltools

6
推荐指数
2
解决办法
1998
查看次数

DT Shiny 按列不同的自定义列标题

我的 css 技能非常有限,但假设以下示例:

  sketch = htmltools::withTags(table(
     class = 'display',
     thead(
        tr(
           th(rowspan = 2, 'Species'),
           th(colspan = 2, 'Sepal'),
           th(colspan = 2, 'Petal')
        ),
        tr(
           lapply(rep(c('Length', 'Width'), 2), th)
        )
     )
  ))
  datatable(head(iris, 10), 
     container = sketch, options = list(
     initComplete = JS(
        "function(settings, json) {",
        "$(this.api().table().header()).css({'background-color': '#000', 'color': '#fff'});",
        "}")
  ))
Run Code Online (Sandbox Code Playgroud)

我怎么会改变颜色编码的前两个列标题为蓝色的说,这样的列标题,两排Sepal,LengthSepal,Width是蓝色的,但保留作为另一种颜色以下结构Petal,LengthPetal,Width

在 Stephane 的初步回答之后,我添加了一个示例。

例子

css r shiny dt htmltools

6
推荐指数
1
解决办法
1536
查看次数

单击传单标记将您带到URL

在R的宣传资料包中,是否可以点击标记并定向到URL?*

JS中这似乎是可能的。


添加带有URL的独立弹出窗口很容易:

library(leaflet)
content <- paste(sep = "<br/>",
                 "<b><a href='http://www.samurainoodle.com'>Samurai Noodle</a></b>"
)

leaflet() %>% addTiles() %>%
  addPopups(-122.327298, 47.597131,  content,
             options = popupOptions(closeButton = FALSE)
  )
Run Code Online (Sandbox Code Playgroud)

添加标记时也很简单,当单击该标记时,将在弹出窗口中提供一个URL:

leaflet() %>% addTiles() %>%
  addMarkers(-122.327298, 47.597131, popup =  content,
            options = popupOptions(closeButton = FALSE)
  )
Run Code Online (Sandbox Code Playgroud)

也许有一些习惯传递给传单了...吗?


最后,自定义JS函数如何为每个地图标记显示不同的URL?考虑示例data.frame:

df <- data.frame(url = c("/sf/ask/tagged/python/",
                         "/sf/ask/tagged/r/")),
                 lng = c(-122.327298, -122.337298),
                 lat = c(47.597131,47.587131))
Run Code Online (Sandbox Code Playgroud)

* 之前曾有人问过这个问题,但我在这里再问一个问题,并举一个最小的,可复制的例子。

javascript r leaflet htmlwidgets htmltools

5
推荐指数
1
解决办法
202
查看次数

如何将R ggplot图形存储为html代码段

我通过使用ggplotly()和htmltools函数(例如h3()和)创建各种对象来创建html文档html()。然后,我将它们作为列表提交htmltools::save_html()以创建html文件。

我想将ggplot图表直接添加为图像,而不是附加所有杂乱无章的钟声。最后,我将创建一个自包含的html文件(无依赖项),而内容丰富的工作会使该文件过大。

是否有一些将ggplot对象转换为html类型对象的函数?还是我必须将ggplot保存为.png文件,然后将.png文件读入我添加到save_html()函数列表中的某个对象中?

我的R代码如下所示:

library("tidyverse")
library("plotly")
library("htmltools")

HTMLOut <- "c:/Users/MrMagoo/My.html")
df <- data.frame(x=1:25, y=c(1:25*1:25))

g7 <- ggplot(df,aes(x=x, y=y)) + geom_point()
p7 <- ggplotly(g7)  # I would like to use something other than ggplotly here. Just capturing the ggplot as an image would be fine.

# create other objects to add to the html file
t7 <- h2(id="graph7", "Title for graph #7")
d7 <- p("description of graph 7")

save_html(list(t7, p7, d7), HTMLOut)
# …
Run Code Online (Sandbox Code Playgroud)

r ggplot2 htmltools

4
推荐指数
2
解决办法
1591
查看次数

R:为networkD3绘图添加标题并保存

我有兴趣为使用NetworkD3创建的forceNetwork图表添加标题,并使用magrittr导出html.

R:HTML Tag Object帮助页面中找到了一个解决方案,以便添加标题.然后我被指示browsable()"更改networkD3情节的背景颜色" StackOverflow问题中添加htmltool 参数- 来自@timelyportfolio的回答.

下面我提供了一个最小的工作示例,用于添加标题,然后保存没有标题的网络,最后我的非工作尝试将两者结合起来.

library(networkD3)
library(htmltools)

# Load data
data(MisLinks)
data(MisNodes)

# Plot with title in R Viewer
browsable(
  tagList(
    tags$h1("Title"),
      forceNetwork(Links = MisLinks, Nodes = MisNodes,
                   Source = "source", Target = "target",
                   Value = "value", NodeID = "name",
                   Group = "group", opacity = 0.8)
  )
)
Run Code Online (Sandbox Code Playgroud)

虽然我可以使用magrittr保存没有标题%>%:

library(magrittr)

# Plot and save to Mis.html
forceNetwork(Links = MisLinks, Nodes = MisNodes,
                 Source = "source", Target = "target", …
Run Code Online (Sandbox Code Playgroud)

r d3.js networkd3 htmlwidgets htmltools

3
推荐指数
1
解决办法
1748
查看次数

R传单情节船方向

我有关于船只/船只的位置以及它们所转向的路线的信息。我想将它们绘制在带有看起来像船的自定义图标的传单地图上。我发现"tags"图标 fromglyphicons是最合适的。这里有一些数据可以玩:

dput(head(x))
structure(list(boatName = c("Conti Benguela", "Sunny Bay", "Sunny Horizon", 
"FMT URLA", "Qi Xiang 22", "STI Solidarity"), lat = c(37.115365, 
38.4772017, 14.632, 56.80515, 51.31172, -2.2783283), lon = c(15.2682183, 
-8.7888783, -79.5806667, 7.601885, -143.5678933, 46.6328383), 
    cog = c("16", "331", "182", "21", "288", "72")), row.names = c(NA, 
6L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

cog指示地面上的路线,图标转换为旋转角度。我正在使用以下代码当前绘制船只的位置和根据船只转向的路线旋转:

shipIcon <- makeAwesomeIcon("tag",iconRotate = x$cog)
leaflet() %>% addTiles() %>% 
  addAwesomeMarkers(lng=x$lon,lat=x$lat,icon=shipIcon,popup = x$boatName)
Run Code Online (Sandbox Code Playgroud)

但是,如您所见,makeAwesomeIcon为我不想要的图标添加了一个背景标记。我已经看过thisthis,后者正是我想要做的。我怎样才能完成我的任务,即根据它在没有标记背景的情况下转向的路线显示带有旋转的自定义船舶图标?

r leaflet htmlwidgets htmltools

3
推荐指数
1
解决办法
1764
查看次数

通过 includeMarkdown 包含覆盖内联代码的外部 Markdown 文件

我想包括覆盖内联代码的外部降价文件。当我在 RStudio 上点击 Knit 时,它确实只显示代码文本,而不是 sys.time 的实际值。如果我将about.md的内容放入main.Rmd中,就没有问题。该点应该与 includeMarkdown 相关,但除了路径之外不带任何参数。有什么建议 ?提前致谢

主.Rmd

---
title: "test"
author: "test"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    social: menu
    vertical_layout: fill
---
```{r}
  htmltools::includeMarkdown('about.md')
```
Run Code Online (Sandbox Code Playgroud)

关于.md

Today is `r format(Sys.time(), "%d %B %A %Y")`
Run Code Online (Sandbox Code Playgroud)

电流输出

Today is r format(Sys.time(), "%d %B %A %Y")
Run Code Online (Sandbox Code Playgroud)

r inline knitr r-markdown htmltools

3
推荐指数
1
解决办法
757
查看次数

Rmarkdown - 打印对象列表而不显示那些讨厌的 [[indices]]

这会有点罗嗦,因为如果没有适当的上下文,我不知道如何提出我的问题。

没有过多介绍细节,在我的summarytools包中,我by()通过使用包装函数来处理对象print.summarytools,即view(). 此view()函数可以识别通过by或创建的对象lapply(),并将其组件分派到包的print(),以及与标题和脚注相关的适当参数,等等(第一个元素不会接收与第二个或最后一个相同的参数)。

链接到包开发页面:

该软件包提供了两种呈现内容的方式:通过 rmarkdownpander和使用 RStudio 的htmltools. 就rmarkdown/pander而言,我取得了令人满意的结果。对于 rmarkdown 文档中的 HTML 渲染,情况并非如此。

例如:

library(devtools)
install_github("dcomtois/summarytools", ref = "dev-current")
library(summarytools)

# call the descr() function through by() to get stats by gender
groupstats <- by(data = exams, INDICES = exams$gender, FUN = descr)

# Use the view() function to neatly display results
view(groupstats, method = 'render')
Run Code Online (Sandbox Code Playgroud)

此示例可作为github 上的 …

knitr r-markdown htmltools summarytools

2
推荐指数
1
解决办法
3994
查看次数

设置 R 网页的传单标题

我正在使用 R 传单包生成地图。创建网页时,将网页的<title>元素设置为“leaflet”:

<title>leaflet</title> 
Run Code Online (Sandbox Code Playgroud)

我想将其更改为内容更丰富的内容,但我看不出有什么方法可以做到这一点。我看过这里的讨论,但那是在地图本身上添加标题。我想做一些不同的事情:设置显示在浏览器选项卡顶部的标题。

有没有一种简单的方法可以使用传单或 htmltools 来做到这一点?

r leaflet htmltools

2
推荐指数
1
解决办法
174
查看次数

如何避免使用 R 加载命名空间时出错

我正在尝试使用以下命令启动一个闪亮的应用程序。

Rscript -e "shiny::runApp('test-app', launch.browser=TRUE)"
Run Code Online (Sandbox Code Playgroud)

但是,我收到如下错误

Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) :
  namespace 'htmltools' 0.4.0 is being loaded, but >= 0.4.0.9003 is required
Calls: :: ... getNamespace -> loadNamespace -> namespaceImport -> loadNamespace
Execution halted
Run Code Online (Sandbox Code Playgroud)

我确实检查了我的库文件夹并看到该htmltools包存在。

我也尝试过以下dependencies=TRUE

install.packages(pkgs,lib = "C:/Users/User/Desktop/data/library",repo = "https://cloud.r-project.org",dependencies=TRUE)
Run Code Online (Sandbox Code Playgroud)

这里的 pkgs 是一个包含必须安装的软件包列表的列表。

问题是相同的脚本在我的系统中工作,但在我同事的系统中不起作用。我该如何解决这个问题?

可以帮助我了解问题所在吗?

r shiny shinyapps htmltools

2
推荐指数
1
解决办法
3万
查看次数