R 动态创建用户界面

R 动态创建用户界面,r,list,user-interface,shiny,R,List,User Interface,Shiny,背景: 我有一个名为btnuploadmonthylfile的文件输入,用户将使用该文件上传数据文件。上载的数据文件包含一个名为“Products”的字段。单击btnUploadMonthlyfile我想显示一个弹出窗口,其中应该包含上传文件中存在的每个不同产品的一个框,在每个产品的框中,我想显示与该产品相关的一些摘要/指标 我在下面写了一段代码来实现同样的功能 服务器.R observeEvent(input$btnMonthlySanityAppend,

背景:

我有一个名为
btnuploadmonthylfile
的文件输入,用户将使用该文件上传数据文件。上载的数据文件包含一个名为“Products”的字段。单击
btnUploadMonthlyfile
我想显示一个弹出窗口,其中应该包含上传文件中存在的每个不同产品的一个框,在每个产品的框中,我想显示与该产品相关的一些摘要/指标

我在下面写了一段代码来实现同样的功能

服务器.R

     observeEvent(input$btnMonthlySanityAppend,
                 {
                    sFilePath<-input$btnUploadMonthlyFileForAppend
                    dtUploadedFile<-as.data.table(read_csv(sFilePath$datapath))

                  lReturn <- fcnUploadSanityCheckMonthly(dtUploadedFile)
                        showmodal(modaldialog(
                        title="Summary",
                        lReturn$Display
                        ))    
                 }
     )
注意:-
fcndosomeprocessingondes(dtToProcess)
是一个函数,它根据dtToProcess中的产品值进行处理并返回一个表,因此对于每个产品,该函数将返回一个具有不同值的表

问题: 上述代码根据上传文件中存在的产品数量创建动态框,但每个产品框的框下显示的数据表始终是最后一个,即
lDateInformationTable
的值包含在循环最后一次迭代中处理的数据表框

我已经调试了函数
fcndosomeprocessingondes
,它总是根据产品返回正确的数据表

在我看来,可能是
lDateInformationTable
的值作为引用,因为它总是包含在循环的最后一次迭代中处理的数据表


任何帮助都将不胜感激

我以前遇到过这个问题,使用
lappy
而不是for循环解决了这个问题。这与这样一个事实有关,即创建的对象不会立即求值,并且会在for循环中引用发生更改的变量。因此,请尝试将for循环替换为以下内容:

fcnUploadSanityCheckMonthly <- function(dtUploadedFile){
    lUniqueProductsITable <- uniqueN(dtUploadedFile,by = c("Product_ID"))
    lUniqueProductName <- unique(dtUploadedFile[,"Product_Name"])
    lBoxList <- vector("list",lUniqueProductsITable)
    dtToProcess <- copy(dtUploadedFile)
    lapply(i in 1:lUniqueProductsITable), function(i)
    {   tags$br()
        tags$hr()            
        sProduct <- lUniqueProductName[i]
        dtFilteredOnProduct <- dtToProcess[dtToProcess[["Product_Name"]] %in% sProduct ]
        dtDataInfo <- fcnDoSomeProcessingOnDates(dtToProcess)
        lDateInformationTable <- box(title=sTitle  ,width=12,status = "primary",solidHeader = T,collapsible = T,collapsed = T,
       renderDataTable(dtDataInfo ,options=list(scrollX=T))
       )
       }

     box(width = 12,status = "primary",solidHeader = T,collapsible = T,collapsed = T,
     title = lUniqueProductName[i],
     lDateInformationTable
     )
    }
    )
    return(list(Display=lBoxList))    
}

fcnUploadSanityCheckMonthly感谢您的及时回复,我有几个问题1)如何以及为什么这样做?2) 由于我没有在server.R中编写这段代码,而是在一个单独的R文件中编写,如何从这段代码中返回一个值并在我的server.R代码的showmodel中使用它?我找到了另一篇文章,请参阅。希望能对你有所帮助,在评论中也有链接,进一步解释原因!非常感谢:),我现在正在工作,肯定会经历它,可能会再次困扰你:pHi Rohit,如果你这样做,请检查指南。我想这会让你更容易得到帮助。
fcnUploadSanityCheckMonthly <- function(dtUploadedFile){
    lUniqueProductsITable <- uniqueN(dtUploadedFile,by = c("Product_ID"))
    lUniqueProductName <- unique(dtUploadedFile[,"Product_Name"])
    lBoxList <- vector("list",lUniqueProductsITable)
    dtToProcess <- copy(dtUploadedFile)
    lapply(i in 1:lUniqueProductsITable), function(i)
    {   tags$br()
        tags$hr()            
        sProduct <- lUniqueProductName[i]
        dtFilteredOnProduct <- dtToProcess[dtToProcess[["Product_Name"]] %in% sProduct ]
        dtDataInfo <- fcnDoSomeProcessingOnDates(dtToProcess)
        lDateInformationTable <- box(title=sTitle  ,width=12,status = "primary",solidHeader = T,collapsible = T,collapsed = T,
       renderDataTable(dtDataInfo ,options=list(scrollX=T))
       )
       }

     box(width = 12,status = "primary",solidHeader = T,collapsible = T,collapsed = T,
     title = lUniqueProductName[i],
     lDateInformationTable
     )
    }
    )
    return(list(Display=lBoxList))    
}