Shiny主面板显示风格和字体

22

我正在学习 shiny 应用程序并有关于修改布局(特别是样式和字体)的基本问题。希望能得到指引或明确的答案,谢谢!

考虑一个基本的输入-输出应用程序:用户在 sidebarPanel 中输入数据,它会反应性地在 mainPanel 中输出结果。

enter image description here

  1. 如何使 mainPanel 中的输出表格看起来更像 sidebarPanel?比如说一个大约相同大小的带有彩色背景(可能是另一种颜色)的矩形,并且数据出现在一个类似大小的框中。

  2. 如何控制面板内字体类型、字体大小和字号?

从代码中可以看出(参见下面几行 runGist 的细节),我已经成功地定制了 sidebarPanel 中 numericInput 框的大小,但我无法控制字体样式(我的 tag$style 代码是否放错位置了?)。

重要的是出于美观目的,我想知道如何格式化 mainPanel 以使其看起来像 sidebarPanel。大部分是从 shiny 网站的示例进行修改,但我显然错过了一些重要的东西。

编辑1:根据 Scott Chamberlain 的建议,我已经在 github 上复制了 server.R 和 ui.R 文件:

library("shiny") 
runGist("gist.github.com/annoporci/7313856") 

编辑2:Scott建议使用Chrome/Firefox的“检查元素”功能(在html页面的主体上右键单击,其他浏览器可能具有相同的功能)。下面是一张屏幕截图:

检查元素

输入图片说明

使用“检查元素”工具是非常有益的,正如Scott所建议的。

以下是我学到的内容(如果我没有弄错的话):

  • container-fluidrow-fluid控制整个容器。
  • span12控制headerPanel
  • span4控制sidebarPanel
  • span8控制mainPanel
  • shiny-bound-input用于输入端
  • shiny-bound-outputshiny-html-output(两者都似乎有效)用于输出端

根据这些发现,我将HTML样式放置在mainPanel中,因为它似乎是一个明显的地方,但也可以在sidebarPanel内部工作。对我来说更直观的做法是将其直接放在pageWithSidebar()内部,但那样不起作用。

下面是编辑后的shiny代码:

runGist("https://gist.github.com/annoporci/7346772")

这里是HTML样式:

  HTML('<style type="text/css">
    .row-fluid { width: 50%; }  
    .well { background-color: #99CCFF; }
    .shiny-html-output { font-size: 20px; line-height: 21px; }
  </style>')

为了保持容器较小,我将总体容器宽度设为50%。

侧边栏和主面板我选择了相同的颜色。

输出框中我选择了更大的字体,虽然在这里看起来不太美观,但在我的实际应用程序中是有意义的。此外,我只是在尝试一些东西。

我选择了一个行高为21px而不是默认的20px,只是为了微调输出框的高度与输入框相同。同样,这是一个实验。

我还在server.R中改变了显示样式,具体来说

output$myResults <- renderText({
  r <- myFunction(input$myinput)
  c("My Output:","<br><br>",r)
})
这是因为我想让结果显示在“我的输出”下面的文字之下。通过尝试和错误,我发现可以使用向量()中的字符串,并使用<br><br>作为分隔符来强制进行换行。 如果您知道正确的方法,请参与并提供建议,否则我会感到震惊,因为这可能不是推荐的方法。
次要跟进问题:
我将查看是否可以找到一种方法,使我的输出结果出现在类似于侧边栏面板中输入数字的白色框中。 欢迎任何建议。
是否有可能将所有HTML修改收集到同一个单独的文件中,与server.R和ui.R一起存储?
我会选择Scott的答案,因为他已经帮助我发现了足够的东西,以使我的输出接近我想要的方式。 但是,如果您在上述描述中看到错误或不准确之处,请编辑。

你可以将这两个文件放在gist中,然后我们就可以像这样轻松测试它 https://gist.github.com/SChamberlain/7309662,接着我们可以使用library(shiny); runGist("https://gist.github.com/SChamberlain/7309662") - sckott
运行得非常好,谢谢 Scott!library("shiny") runGist("https://gist.github.com/annoporci/7313856") - PatrickT
3个回答

7
您可以在调用sidebarpanel时包含任意的 html,例如,您可以这样做。
HTML('<style type="text/css">
     .row-fluid .span4{width: 26%;}
     </style>')

这只是我其中一个Shiny应用程序的副本

你可以使用浏览器中的检查工具来确定需要更改哪些css元素。

如果你在mainPanel内使用wellPanel,这将修改wellPanel的颜色为蓝色。

HTML('<style type="text/css">
        .span8 .well { background-color: #00FFFF; }
        </style>'), 

谢谢Scott,我终于开始测试了。如果可以的话,我有几个问题:1)您所说的“浏览器中的检查工具”是什么意思(特定的浏览器吗?);2)您能解释一下每个工具都是做什么的吗?只有__.row-fluid {width: 30%}__似乎有用,而且无论我将其放在__sidebarPanel__还是__mainPanel__中,它都会执行相同的操作。您能否评论一下.span4,.leaflet?我如何为__mainPanel__添加背景颜色?谢谢! - PatrickT
抱歉,我在Chrome中使用的是“开发者工具”,或者在Firefox中有一个相当的工具。我这么说是因为我不确定您需要更改页面的哪个元素。再次抱歉,我放入的示例代码并不是为了解决您的问题 - 只是我的一个例子 :) .span4正在调整一个span4元素,我认为那是侧边栏。我去掉了.leaflet,但那是我应用程序中的地图... - sckott
嘿@PatrickT,我编辑了上面的代码,或许是部分解决方案。 - sckott
1
@PatrickT和Scott:或者更方便的是,您可以执行tags $ script(type =“text / css”,“.span8 .well {background-color:#00FFFF; }”) - Stéphane Laurent
是的,谢谢。或者编写一个单独的CSS文件并使用includeCSS。 - PatrickT

4
这篇文章已经很老了,但为了记录:你可以在mainPanel()函数中直接放入CSS。如果你想要在侧边栏布局的mainPanel中设置一个固定位置的图表:
sidebarLayout(
     sidebarPanel(), 
     mainPanel(style="position:fixed;margin-left:32vw;",
          plotOutput("plot")
     )
)

3

在Shiny中插入样式的另一种方法是通过其tag命令。结果与插入普通HTML相同:

tags$style(type="text/css", ".span8 .well { background-color: #00FFFF; }")

该结果与插入纯HTML代码相同(在此示例中,结果将与Scott的最后一个代码片段相同)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接