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))
}