使用shinyTree包的R Shiny树视图

时间:2016-11-03 13:44:16

标签: r tree shiny shinytree

我正在使用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转换)。我如何才能实现同样的目标。

1 个答案:

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

ui.R

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.R

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