Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在观察上下文中对反应变量使用IF语句_R_Shiny - Fatal编程技术网

R 在观察上下文中对反应变量使用IF语句

R 在观察上下文中对反应变量使用IF语句,r,shiny,R,Shiny,我试图在Markdown中创建一个闪亮的flexdashboard,它将根据用户输入显示不同的表。有些表是可格式化的,有些只是常规表。如果列表中的表都是Formattables,则以下代码将执行表的呈现 num <- reactive(as.integer(input$qualityDataNum)) renderFormattable(qualityData[[num()]]) 质量统计 品质 num对于独立应用程序: 为了轻松实现您的期望,我建议为每种绘图仪类型生成一个输出,并仅在选

我试图在Markdown中创建一个闪亮的flexdashboard,它将根据用户输入显示不同的表。有些表是可格式化的,有些只是常规表。如果列表中的表都是Formattables,则以下代码将执行表的呈现

num <- reactive(as.integer(input$qualityDataNum))
renderFormattable(qualityData[[num()]])
质量统计 品质
num对于独立应用程序:

为了轻松实现您的期望,我建议为每种绘图仪类型生成一个输出,并仅在选择相应的输入时进行填充

下面你可以找到一个完整的例子

一般来说,不建议将输出类型(服务器端的不同呈现函数)混合到一个输出函数(UI端)中


在这里,根据select输入呈现表,可以同时使用此方法呈现多个表。这是因为req()函数检查需求是否已满足,并且只有在满足时才继续处理(也称为绘制)。如果没有,则返回一个空对象。由于我们在渲染函数中使用的是被动输入,因此每次输入值更改时,表达式都会进行求值。如果你不想用一个孤立的()函数包装它,它告诉封装函数每次封装封装的反应值/输入时不重新评估函数。在您的情况下,为包含您的问题的完整(但简单)闪亮的应用程序提供一些代码。嗨,我会尝试在observe语句中添加req(num())作为第一行,然后它就可以工作了。使用req()可以在执行代码之前测试值是否存在。至于其他方面,我需要同意@bretauv的观点,很遗憾,您的示例不足以重现错误。我将看看是否可以添加更多代码。问题是代码现在不容易访问。但是感谢您的最初帮助。完成提供的示例代码。请注意,上面的代码运行(没有错误),但仪表板上没有显示任何内容。谢谢您的帮助。这似乎需要注意一点——qualtyData2表呈现为OK,但显示在一堆空白之后。似乎空对象不是完全空的:)此外,我注意到第二个表似乎继承了第一个表的格式。qualityData2显示为一个fomattable,只是没有颜色高亮显示。
num <- reactive(as.integer(input$qualityDataNum))
observe({
  if (num() == 1) {
    renderFormattable(qualityData1)
  } else {
    renderTable(qualityData2)
  }
})
# allow sharing of dashboard
library(datasets)
library(flextable)
library(formattable)
library(dplyr)

options(stringsAsFactors = FALSE)

qData <- data.frame(Name = "AAA", Releases = 10, Coverage = 23.0)
qData <- bind_rows(qData, data.frame(Name = "BBB", Releases = 35, Coverage = 88.0))

#Using Formattable

data_formatter_dd <- 
  formattable::formatter("span", style = x ~ style( font.weight = "bold",
    color = ifelse(x > 80.0 & x <= 100.0, "green", ifelse(x > 50.0 & x <= 80.0, "orange", "red"))))

qualityData1 <- formattable::formattable(qData, align = c("l", rep("r", ncol(qData) - 1)),
  list('Name' = formattable::formatter("span", style = ~ style(color = "grey", font.weight = "bold")),
  'Coverage' = data_formatter_dd))

#Using flextable

qualityData2 <- flextable(head(qData, col_keys = c("Name", "Releases", "Coverage")))

# shiny inputs
selectInput("qualityDataNum", label = h3("Quality Number Set"), choice = list("1" = 1, "2" = 2),
  selected = 1)
num <- reactive(as.integer(input$qualityDataNum))
observe({
  req(num())
  if (num() == 1) {
    renderFormattable(qualityData1)
  } else {
    renderTable(qualityData2)
  }
  })



# allow sharing of dashboard
library(datasets)
library(flextable)
library(formattable)
library(dplyr)
library(shiny)



options(stringsAsFactors = FALSE)

qData <- data.frame(Name = "AAA", Releases = 10, Coverage = 23.0)
qData <- bind_rows(qData, data.frame(Name = "BBB", Releases = 35, Coverage = 88.0))

data_formatter_dd <- 
formattable::formatter("span", style = x ~ style( font.weight = "bold",
                                                    color = ifelse(x > 80.0 & x <= 100.0, "green", ifelse(x > 50.0 & x <= 80.0, "orange", "red"))))

qualityData1 <- formattable::formattable(qData, align = c("l", rep("r", ncol(qData) - 1)),
                                        list('Name' = formattable::formatter("span", style = ~ style(color = "grey", font.weight = "bold")),
                                            'Coverage' = data_formatter_dd))

qualityData2 <- flextable(head(qData, col_keys = c("Name", "Releases", "Coverage")))




ui <- fluidPage(
fluidRow(



selectInput("qualityDataNum", label = h3("Quality Number Set"), choice = list("1" = 1, "2" = 2),
            selected = 1)
,
tableOutput("table2"),
formattableOutput("table1")

)
)



server <- function(input, output, session) {





output$table1 <- renderFormattable({
    req(as.integer(input$qualityDataNum) == 1)
    qualityData1
})


output$table2 <- renderTable({
    req(as.integer(input$qualityDataNum) != 1)
    qualityData2$body$dataset
})




}


shiny::shinyApp(ui,server)
renderFormattable({
    req(as.integer(input$qualityDataNum) == 1)
    qualityData1
})


renderTable({
    req(as.integer(input$qualityDataNum) != 1)
    qualityData2$body$dataset
})