楼主: drunkfish69
1524 9

[问答] 请教如何实现shiny中for循环中的表格输出? [推广有奖]

  • 0关注
  • 1粉丝

博士生

74%

还不是VIP/贵宾

-

威望
0
论坛币
509 个
通用积分
629.6114
学术水平
16 点
热心指数
25 点
信用等级
13 点
经验
5026 点
帖子
166
精华
0
在线时间
535 小时
注册时间
2018-8-9
最后登录
2024-1-30

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有2个数据表,采购单头信息表和采购单明细采购项记录。想要实现在shiny输出一行头文件记录,然后列出明细记录表中相关订单记录。但在循环体内输出表格未能实现,代码简化了一下,如下,请高手不吝指教。
  1. library(shiny)
  2. library(DT)

  3. ui <- fluidPage(
  4.   fluidPage(
  5.     titlePanel("Purchase Order"),

  6.     fluidRow(
  7.         DT::dataTableOutput("head"),
  8.         DT::dataTableOutput("PO")
  9.     )
  10.   )
  11. )

  12. server <- function(input, output) {
  13.    
  14.   pohead <- structure(list(
  15.     po_num = c(110, 120, 130),
  16.     Vendor = c("A", "B", "A"),
  17.     Amount = c(1000, 300, 500)
  18.   ),
  19.   row.names = c(NA, -3L),
  20.   class = c("tbl_df", "tbl", "data.frame")
  21.   )
  22.   
  23.   podetail <- structure(list(
  24.     po_num = c(110, 110, 120, 120, 130),
  25.     Item = c(
  26.       "Toy Cat", "Toy Bear", "Screw",
  27.       "Tools", "Toy Sneak"
  28.     ),
  29.     Amount = c(500, 500, 100, 200, 500)
  30.   ),
  31.   row.names = c(NA, -5L),
  32.   class = c("tbl_df", "tbl", "data.frame")
  33.   )
  34.   
  35.   # output$head <- renderDataTable(pohead)
  36.   # output$PO <- renderDataTable(podetail)
  37.   
  38.   for (i in 1:length(pohead)) {
  39.       num <- pohead[i,]$po_num
  40.       output$head <- renderDataTable(pohead[i,])
  41.       output$PO <- podetail %>%
  42.           filter(po_num == num) %>%
  43.           renderDataTable()
  44.       }

  45. }
  46. shinyApp(ui = ui, server = server)
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:for循环 Shiny 如何实现 Shin For

沙发
owenqi 在职认证  学生认证  发表于 2020-10-16 11:39:01 |只看作者 |坛友微信交流群
没看明白,你 renderDataTable(podetail)的这个表,里面的搜索框输入po_num,比如110,那他不就已经只显示有关110的信息里吗?

使用道具

藤椅
drunkfish69 发表于 2020-10-16 13:56:03 |只看作者 |坛友微信交流群
没看明白,你 renderDataTable(podetail)的这个表,里面的搜索框输入po_num,比如110,那他不就已经只显示有关110的信息里吗?
问题就是web显示不出任何东西。

使用道具

板凳
owenqi 在职认证  学生认证  发表于 2020-10-17 08:41:45 |只看作者 |坛友微信交流群
drunkfish69 发表于 2020-10-16 13:56
问题就是web显示不出任何东西。
我用你的代码,38-39行去掉评论,41-47行评论掉。
然后运行以后就是我描述的结果,也是你形容的功能啊。

使用道具

报纸
drunkfish69 发表于 2020-10-17 09:45:38 |只看作者 |坛友微信交流群
我用你的代码,38-39行去掉评论,41-47行评论掉。
我知道38~39可以输出,但这不是我想要的结果。我想要的:

HEAD:订单110,供应商,订单总金额
Detail:订单110, ITEM#1, 金额
Detail:  订单110, ITEM#2, 金额

HEAD:订单120,供应商,订单总金额
Detail:订单120, ITEM#1, 金额
Detail:  订单120, ITEM#2, 金额

HEAD:订单130,供应商,订单总金额
Detail:订单130, ITEM#1, 金额

使用道具

地板
drunkfish69 发表于 2020-10-18 11:42:21 |只看作者 |坛友微信交流群
  1. library(shiny)
  2. library(kableExtra)
  3. library(reshape2)

  4. ui <- fluidPage(
  5.   fluidPage(
  6.     titlePanel("Purchase Order"),

  7.     fluidRow(
  8.       tableOutput("PO")
  9.     )
  10.   )
  11. )

  12. server <- function(input, output){
  13.   pohead <- structure(list(
  14.     po_num = c(110, 120, 130),
  15.     Vendor = c("A", "B", "A"),
  16.     Amount = c(1000, 300, 500)
  17.     ),
  18.     row.names = c(NA, -3L),
  19.     class = c("tbl_df", "tbl", "data.frame")
  20.     )
  21.   podetail <- structure(list(
  22.     po_num = c(110, 110, 120, 120, 130),
  23.     Item = c(
  24.       "Toy Cat", "Toy Bear", "Screw",
  25.       "Tools", "Toy Sneak"
  26.       ),
  27.     Amount = c(500, 500, 100, 200, 500)
  28.     ),
  29.     row.names = c(NA, -5L),
  30.     class = c("tbl_df", "tbl", "data.frame")
  31.     )
  32.   podetail <- cbind(podetail)
  33.   PO <- c()
  34.   for (i in 1:nrow(pohead)) {
  35.     num <- pohead[i, ]$po_num
  36.     PO <- rbind(PO, paste(colnames(pohead)))
  37.     PO <- rbind(PO, paste(pohead[i, ]))
  38.     temp <- podetail[podetail$po_num == num, ]
  39.     PO <- rbind(PO, paste(colnames(podetail)))
  40.     for (j in 1:nrow(temp)) {
  41.       PO <- rbind(PO, paste(temp[j, ]))
  42.       }
  43.     }
  44.   output$PO <- renderTable(PO, colnames = F)
  45.   }
  46. shinyApp(ui = ui, server = server)
复制代码

这种写法有点蛋疼,两个记录的字段还要凑一样长。看来这种类型报表想用R取代Crystal Report有点想多了。

使用道具

7
owenqi 在职认证  学生认证  发表于 2020-10-19 01:46:31 |只看作者 |坛友微信交流群
如果我没有理解错的话,你想要的是这样?
  1. library(shiny)
  2. library(dplyr)

  3. pohead <- structure(list(
  4.   po_num = c(110, 120, 130),
  5.   Vendor = c("A", "B", "A"),
  6.   Amount = c(1000, 300, 500)
  7. ),
  8. row.names = c(NA, -3L),
  9. class = c("tbl_df", "tbl", "data.frame")
  10. )
  11. podetail <- structure(list(
  12.   po_num = c(110, 110, 120, 120, 130),
  13.   Item = c(
  14.     "Toy Cat", "Toy Bear", "Screw",
  15.     "Tools", "Toy Sneak"
  16.   ),
  17.   Amount = c(500, 500, 100, 200, 500)
  18. ),
  19. row.names = c(NA, -5L),
  20. class = c("tbl_df", "tbl", "data.frame")
  21. )
  22. podetail <- cbind(podetail)
  23. #
  24. ui <- fluidPage(
  25.   fluidPage(
  26.     titlePanel("Purchase Order"),

  27.     fluidRow(
  28.       tableOutput("PO")
  29.     )
  30.   )
  31. )

  32. server <- function(input, output){

  33.   tbl <- split(podetail, podetail$po_num)
  34.   for(i in 1:length(tbl)){
  35.     tbl[[i]] <- bind_rows(pohead[i,], tbl[[i]]) %>% relocate(Item, .before = 'Amount')
  36.   }
  37.   tbl <- bind_rows(tbl)
  38.   idx <- which(is.na(tbl$Vendor))
  39.   tbl$po_num[idx] <- NA
  40.   output$PO <- renderTable(tbl)
  41. }
  42. shinyApp(ui = ui, server = server)
复制代码

使用道具

8
drunkfish69 发表于 2020-10-19 11:07:44 |只看作者 |坛友微信交流群
如果我没有理解错的话,你想要的是这样?
比我写的好,但如果合并在一起列会很多;实际使用时HEAD和DETAIL就订单号作为检索关键字;其他字段内容差异很大,如果并在一起会很长一行,显示效果一般。最好HEAD和DETAIL能错开。附件是水晶报表的一个真实的采购订单(为了保密把中文encoding关了,中文变方块了),不要求和它一样,在浏览器显示就行,需要才打印;个人觉得详细项表格显示更好。不知道有没有更好的办法?

2000001.pdf

63.16 KB

使用道具

9
owenqi 在职认证  学生认证  发表于 2020-10-20 09:35:16 |只看作者 |坛友微信交流群
那你增加一个输入框(numeric input或者text input)作为po_num的输入,然后输出结果是这两个对应的表格就好了。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-24 04:41