Shiny 中 selectizeInput 和 checkboxInput 之间的不兼容

如何解决Shiny 中 selectizeInput 和 checkboxInput 之间的不兼容

我正在创建一个应用程序,它从一个目录中获取一个文件获取列名,让用户有机会决定要使用哪个样本。

我没有上传文件,而是创建了一个数据框(类似于我的文件)并将其放入响应式函数中(这正是我上传文件时通常所做的)。

这是数据框

numbers <- c(5,345,55,10)
df<-data.frame(t(numbers))
names(df) <- c("S1","S2","S3","S4")

> df
  S1  S2 S3 S4
1  5 345 55 10

我的应用有一个 checkBoxInput,您可以决定是否要对数据框进行对数运算。

如果我想比较 S1 与 S2,我意识到当我不点击进入框(并且我不计算对数)时,样本不会改变。这就是我想要的。

image1

但是,如果我决定做对数(我点击复选框)样本 2 变化(现在它比较了 S1 与 S1,我不明白为什么,我不明白不想)。

image2

这是代码

library(shiny)

# Define UI 
ui <- fluidPage(

    # Application title
    titlePanel("My app"),sidebarLayout(
        sidebarPanel(
            uIoUtput("selected_sample_one"),uIoUtput("selected_sample_two"),checkBoxInput("change_log2","Log2 transformation",value = F),),# Show a plot of the generated distribution
        mainPanel(
           plotOutput("plot")
        )
    )
)

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

    data <- reactive({
        numbers <- c(5,10)
        df<-data.frame(t(numbers))
        names(df) <- c("S1","S4")

        if(input$change_log2 == TRUE){
            df <- log2(df)
        }
        return(df)
    })
    
    
    samples_names <- reactive({
        samples <- colnames(data())
        return(samples)
    })
    
    
    output$selected_sample_one <- renderUI({
        selectizeInput(inputId = "sample_one_axis","Select the 1st sample",choices=samples_names(),options=list(maxOptions = length(samples_names())))
    })
    
    # With this function you can select which sample do you want to plot in the y-axis.
    output$selected_sample_two <- renderUI({
        selectizeInput(inputId = "sample_two_axis","Select the 2nd sample",options=list(maxOptions = length(samples_names())))
    })
    
    output$plot <- renderPlot({
        barplot(c(data()[,input$sample_one_axis],data()[,input$sample_two_axis]))
    })
}

# Run the application 
shinyApp(ui = ui,server = server)

注意:

如果我将列名保存到向量中,则对数和一切正常。 而不是使用

 samples_names <- reactive({
         samples <- colnames(data())
         return(samples)
     })

如果我使用:samples_names <- c("S1","S4") 并且我用这个新向量 output$selected_sample_one 改变了 output$selected_sample_twosamples_names第二个样本不会改变 (见新图)

image3

但是,如果我增加列数或更改表,此代码将不起作用。因此,我将它写在反应式函数中...

有人知道如何解决这个问题吗?

非常感谢

解决方法

那是因为您的反应式数据框包含复选框信息,而 sample_names 取决于该数据框。要将它们分开,请创建一个新的数据帧,您可以在其中执行日志操作,而使初始数据帧不进行日志转换。试试这个

library(shiny)

# Define UI 
ui <- fluidPage(
  
  # Application title
  titlePanel("My app"),sidebarLayout(
    sidebarPanel(
      uiOutput("selected_sample_one"),uiOutput("selected_sample_two"),checkboxInput("change_log2","Log2 transformation",value = F)
    ),# Show a plot of the generated distribution
    mainPanel(
      plotOutput("plot")
    )
  )
)

# Define server 
server <- function(input,output,session) {
  
  data <- reactive({
    
    numbers <- c(5,345,55,10)
    df<-data.frame(t(numbers))
    names(df) <- c("S1","S2","S3","S4")
    
    return(df)
  })
  
  data1 <- eventReactive(input$change_log2,{
    df <- data()
    if(input$change_log2 == TRUE){
      df <- log2(df)
    }
    return(df)
  })
  
  samples_names <- reactive({
    req(data())
    samples <- colnames(data())
    return(samples)
  })
  
  output$selected_sample_one <- renderUI({
    selectizeInput(inputId = "sample_one_axis","Select the 1st sample",choices=samples_names(),options=list(maxOptions = length(samples_names())))
  })
  
  # With this function you can select which sample do you want to plot in the y-axis.
  output$selected_sample_two <- renderUI({
    selectizeInput(inputId = "sample_two_axis","Select the 2nd sample",selected=samples_names()[2],options=list(maxOptions = length(samples_names())))
  })
  
  output$plot <- renderPlot({
    req(input$sample_one_axis,input$sample_two_axis,data1())
    barplot(c(data1()[,input$sample_one_axis],data1()[,input$sample_two_axis]))
  })
}

# Run the application 
shinyApp(ui = ui,server = server)

output

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?