我正在使用shinyTree包在R Shiny中创建树视图,能够做到这一点。已用于服务器部分的代码具有列表创建。现在,额外的要求是将数据帧转换为列表并导入相同的内容以使用renderTree实现树结构。
这是我写的代码:
#ui part
library(shiny)
library(shinyTree) # Using shinyTree Package
# UI for application that demonstrates a Tree View
shinyUI(
pageWithSidebar(
# Application title
headerPanel("Tree View in Shiny"),
sidebarPanel(
helpText(HTML("A simple Shiny Tree example.
<hr>Created using shinyTree Package."))
),
mainPanel(
# Show a simple table.
shinyTree("tree")
)
))
#--------------------------------------------------------------------
#server part
library(shiny)
library(shinyTree)
# server logic required to generate a tree structure
shinyServer(function(input, output, session) {
output$tree <- renderTree({
**list(
Folder1 = list(File1.1 = structure("",sticon="file"), File1.2 = structure("",sticon="file")),
Folder2 = list(
Subfolder2.1 = list(File2.1.1 = structure("",sticon="file"), File2.1.2 = structure("",sticon="file")
, File2.1.3=structure("",sticon="file")),
Subfolder2.2 = list(File2.2.1 = structure("",sticon="file"), File2.2.2 = structure("",sticon="file")),
File2.3 = structure("",sticon="file")
)**
)
})
})
代码的星形部分需要替换为list(已使用dataframe转换)。我如何才能实现同样的目标。
答案 0 :(得分:1)
这里使用递归方法cab从数据帧中获取树结构。
<强>解决方案:强>
a<-read.csv("Tree.csv") # Importing the dataframe
# Recursion function to get tree structure
gettree<-function(a)
{
# defining tree as list
tree<-list()
# Condition to identifly if selected column is not last column
if(class(a)!="factor"&&length(a)>1)
{
# getting uniques list of names from the columns to create folder
b<-unique(a[,1])
# runnig file name in loop
for(i in b)
{
# check if the flie name i not blank
if(i!="")
{
# subset data for content of folder
subdata<-a[which(a[,1]==i),]
# if there is only one element for that item change icon as file
if(length(subdata[,-1])==1)
{tree[[i]]=structure("",sticon="file")}
else{
# call the function recursively
tree[[i]]<-gettree(subdata[,-1])
}}
}}
# Change icon of last columns as file
if(class(a)=="factor"||length(a)==1)
{
for(i in a)
{
tree[[i]]=structure("",sticon="file")
}
}
return(tree)
}
library(shiny)
library(shinyTree) # Using shinyTree Package
# UI for application that demonstrates a Tree View
shinyUI(
pageWithSidebar(
# Application title
headerPanel("Tree View in Shiny"),
sidebarPanel(
helpText(HTML("A simple Shiny Tree example.
<hr>Created using shinyTree Package."))
),
mainPanel(
shinyTree("tree")
)
))
# server logic required to generate a tree structure
shinyServer(function(input, output, session) {
a<-read.csv("Tree.csv")
# call the function get tree and pass the data frame
tree<-gettree(a)
# render the list in tree
output$tree <- renderTree({
tree
})
})