2

我正在使用 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")
      )**
    )
  })
})

代码的星号部分需要替换为列表(已使用数据框转换)。我怎样才能做到这一点。

4

1 回答 1

1

这里递归方法可用于从数据帧中获取树结构。

解决方案:

将数据框转换为树(列表)的代码

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

服务器.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
  })
})
于 2017-12-09T12:28:47.717 回答