我有一个数据框:

df1<-data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100),ID1=c("A","B"),ID2=(c("A","B","C","D")))

我通过在循环中添加ADD_TRACE来绘制一个带有plotly的3D绘图,如下所示:

library(shiny)
library(plotly)
library(tidyverse)
df1<-data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100),ID1=c("A","B"),ID2=(c("A","B","C","D")))

test<-unique(df1$ID2)
tempt.col<-c("red","blue","green","yellow")
p<-plot_ly()
for(i in 1:length(test)){
  df2<-df1[df1$ID2==test[i],] %>%
    select(a,b,c)
  p<-add_trace(p=p,
               data = df2,
               x=~a,y=~b,z=~c,
               type="scatter3d",
               marker = list(size=5,color=tempt.col[i]),
               mode="markers"
  )
}
p

它工作得非常好,比如:

enter image description here

现在我想在SHILINY中实现这一点,我想根据所选ID的长度生成colourInput个用户界面:

ui<-fluidPage(
  fluidRow(
    sidebarPanel(
      selectInput("select1","Select the ID",choices = colnames(df1[,4:5]),multiple = FALSE),
      actionButton("act1","Go"),
      uiOutput("ui1"),
    ),
    mainPanel(
      tableOutput("table1"),
      plotlyOutput("plot.3d",height = "1000px")
    )
  )
)

服务器:服务器:

server<-function(input,output){
  tempt.group<-reactive({
    unique(df1[,input$select1])
  })
  observeEvent(input$act1,{
    tempt.vector<-list()
    tempt.col.name<-isolate(
      vector(mode = "list",length = 2)
    )
    for(i in 1:length(tempt.group())){
      tempt.vector[[i]]<-colourpicker::colourInput(
        inputId = paste0("ColorID",i),
        label = tempt.group()[i])
      tempt.col.name[[1]][i]<-paste0("ColorID",i)
      tempt.col.name[[2]][i]<-tempt.group()[i]
    }
    output$ui1<-renderUI({
      tempt.vector
    })
    names(tempt.col.name)<-c("inputId","label")
    col.name<-reactive({
      data.frame(sapply(tempt.col.name,cbind))
    })
    
    col.df<-reactive({
      tempt.col.df<-reactiveValuesToList(input)
      data.frame(
        names = names(tempt.col.df[grepl("ColorID", names(tempt.col.df))]),
        values = unlist(tempt.col.df[grepl("ColorID", names(tempt.col.df))], use.names = FALSE)
      )
    })
    
    group.col.df<-reactive({
      merge(col.df(),col.name(),by.x="names",by.y="inputId")
    })
    
    output$table1<-renderTable(
      group.col.df()
    )
    
    pp<-reactive({
      p<-plot_ly()
      for(i in 1:length(tempt.group())){
        # col<-group.col.df()[group.col.df()[,"label"]==tempt.group()[i],"values"] ####it should be something wrong with here
        df2<-df1[df1$ID==tempt.group()[i],] %>%
          select(a,b,c)
        p<-add_trace(p=p,
                     data = df2,
                     x=~a,y=~b,z=~c,
                     type="scatter3d",
                     # marker = list(size=5,color=col[i]),  ####it should be something wrong with here
                     mode="markers"
        )
      }
      p
    })
    output$plot.3d<-renderPlotly({
      pp()
    })
    
  })
  
}


shinyApp(ui=ui,server=server)

The app is like: enter image description here

我想获取colourInput并传递到3D散点图的 colored颜色 ,但都不起作用.页面要么保持刷新,要么冻结, col<-group.col.df()[group.col.df()[,"label"]==tempt.group()[i],"values"]marker = list(size=5,color=col[i])肯定出了什么问题,

请帮帮忙.

推荐答案

下面的代码按预期运行.

library(shiny)
library(plotly)
df1<-data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100),ID1=c("A","B"),ID2=(c("A","B","C","D")))

# Define UI 
ui<-fluidPage(
  fluidRow(
    sidebarPanel(
      selectInput("select1","Select the ID",choices = colnames(df1[,4:5]),multiple = FALSE),
      # actionButton("act1","Go"),
      uiOutput("myui"),
      # keep track of the last selection on all selectInput created dynamically
      
    ),
    mainPanel(
      #tableOutput("table1"),
      plotlyOutput("plot.3d",height = "1000px")
    )
  )
)

# Define server logic required to draw a histogram
server<-function(input,output){
  rv <- reactiveValues(mygroup=0, uitaglist = list(), uilabels = list(), input_subset = list(), plotly=NULL)
  
  observeEvent(input$select1, {
    newgroup <- unique(df1[,input$select1])
    rv$mygroup <- newgroup
    
    # ui tags
    rv$uitaglist <- list()
    for(i in 1:length(rv$mygroup)){
      rv$uitaglist[[i]]<-colourpicker::colourInput(
        inputId = paste0("ColorID",i),
        label = rv$mygroup[i])
      rv$uilabels[[i]] <- paste0("ColorID",i)
    }
   
  })
  
  output$myui <- renderUI({
    rv$input_subset <- rv$uitaglist
  })
  
  observe({
    rv$input_subset <- lapply(rv$uilabels, function(x) input[[x]])
    p<-plot_ly()
    for(i in 1:length(rv$mygroup)) {

      df2<-df1[df1$ID2 == rv$mygroup[i],] %>% select(a,b,c)
      p<-add_trace(p=p,
                   data = df2,
                   x=~a,y=~b,z=~c,
                   type="scatter3d",
                   marker = list(size=5,color=rv$input_subset[[i]]),
                   mode="markers"
      )
    }
    rv$plotly <- p
  })

  output$plot.3d<-renderPlotly({
    rv$plotly
  })
} # end server

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

主要的困难是一次对所有动态生成的UI输入进行observe处理.它可以用observelapply来完成.

enter image description here

观察几个输入是有问题的,因为错误Must use single string to index into reactivevalues是通过try 通过向量或列表索引input来返回的.

现在,这是一个很好的问题,这是一个开箱即用的方法.

R相关问答推荐

R gtsummary tBL_summary,包含分层和两个独立分组变量

有没有一种方法可以在子包上使用‘library()’中的‘exclub’参数?

如何在R中正确对齐放射状图中的文本

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

R Tidymodels textercipes-使用spacyR进行标记化-如何从生成的标记列表中删除标点符号

如何使用按钮切换轨迹?

如何在区分不同条件的同时可视化跨时间的连续变量?

Ggplot2中geom_tile的动态zoom

在带有`R`中的`ggmosaic`的马赛克图中使用图案而不是 colored颜色

R中Gamma回归模型均方误差的两种计算方法不一致

错误包arrowR:READ_PARQUET/OPEN_DATASET&QOT;无法反序列化SARIFT:TProtocolException:超出大小限制&Quot;

防止正则表达式覆盖以前的语句

按两个因素将观测值分组后计算单独的百分比

名字的模糊匹配

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

按两个条件自动过滤数据

R:水平旋转图

从字符串列中的向量中查找第一个匹配的单词