我正在设计一个R程序来输出任何csv文件输入的不同图形。我正在使用Rstudio Shiny和ggPlot2(也许是后来的D3!)来开发程序。然而,对这些语言不熟悉,我遇到了一些重大问题。到目前为止,这是我的计划:
我的相关帖子2天前:How to Specify Columns when a user chooses a file to upload in R?
server.R
library(shiny)
library(datasets)
library(ggplot2)
X <- read.csv(file.choose())
# Define server logic required to summarize and view the selected dataset
shinyServer(function(input, output) {
# Generate a summary of the dataset
output$summary <- renderPrint({
dataset <- X
summary(dataset)
})
# Show the first "n" observations
output$view <- renderTable({
head(X, n = input$obs)
})
createPlot <- function(df, colx, coly) {
ggplot(data=df, aes(x=df[,colx],y=df[,coly]), environment = environment()) + geom_point(size = 3) + geom_line()
}
Y <- reactive({
X
})
# create a basic plot
output$plotBasic <- reactivePlot(function() {
df <- Y()
print(createPlot(df, colx=input$xa, coly=input$ya))
})
})
ui.R
library(shiny)
# Define UI for dataset viewer application
shinyUI(pageWithSidebar(
# Application title
headerPanel("My app!"),
# Sidebar with controls to select a dataset and specify the number
# of observations to view
sidebarPanel(
numericInput("obs", "Number of observations to view:", 13),
numericInput("xa", "Column to plot as X-axis:", 1),
numericInput("ya", "Column to plot as Y-axis:", 2)
),
# Show a summary of the dataset and an HTML table with the requested
# number of observations
mainPanel(
tabsetPanel(
tabPanel("Table", tableOutput("view")),
tabPanel("BasicGraph", plotOutput("plotBasic"))
)
)
))
我的程序有一些问题。我不知道如何在图表上读取的csv数据中显示列名(上传的文件可以是任何内容)。此外,每当我尝试更改图形显示(ggplot函数中的geom)时,它都不会更改图形。这里我添加了“geom_line()”但它只显示了点。如果我尝试执行stat_smooth(),它也不会显示平滑。
另一个问题是图表没有按顺序显示数据(例如,在我传入的数据集中,月份是按顺序,六月,七月,八月,但在图表中它们是混乱的)。 / p>
感谢帮助人员。
我附上了一张程序的图片,以防你无法运行。
答案 0 :(得分:2)
有许多问题需要解决。
Q1:我不知道如何在图表上读取的csv数据中显示列名(上传的文件可以是任何内容)。
您可以通过使用户界面“动态”来实现这一目标。 http://rstudio.github.io/shiny/tutorial/#dynamic-ui
在UI.R 添加
uiOutput("opt.x"), #dynamic UI
uiOutput("opt.y") #value comes from Server.R
在Server.R中添加
output$opt.x <- renderUI({
selectInput("xcolumn", "X column to Plot",
names(Y())
)
})
output$opt.y <- renderUI({
selectInput("ycolumn", "Y Column",
names(Y()))
})
Q2:此外,每当我尝试更改图形显示(ggplot函数中的geom)时,它都不会更改图形。这里我添加了“geom_line()”但它只显示了点。
最有可能的是,您应该收到来自ggplot
的警告消息。分组。
您可以通过明确指定group
参数来解决这个问题。
p <- p + geom_line(aes(group=colx))
问题3:另一个问题是图表没有按顺序显示数据(例如,在我传入的数据集中,月份是按顺序,六月,七月,八月,但在图表中它们是混乱的)
Ggplot正在对日期进行内部排序。 SO上有几个问题可以解决重新排序的不同方法。 (ggplot2: sorting a plot)
总体而言,这是我的UI.R和Server.R
的工作版本library(shiny)
library(datasets)
library(ggplot2)
X <- read.csv(file.choose())
# Define server logic required to summarize and view the selected dataset
shinyServer(function(input, output) {
output$opt.x <- renderUI({
selectInput("xcolumn", "X column to Plot",
names(Y())
)
})
output$opt.y <- renderUI({
selectInput("ycolumn", "Y Column",
names(Y()))
})
# Generate a summary of the dataset
output$summary <- renderPrint({
dataset <- X
summary(dataset)
})
# Show the first "n" observations
output$view <- renderTable({
head(X, n = input$obs)
})
createPlot <- function(df, colx, coly) {
p <- ggplot(data=df, aes(x=df[,colx],y=df[,coly]), environment = environment()) #+ geom_line(aes(x=df[,colx],y=df[,coly], group=colx))
p <- p + geom_line(aes(group=colx))
p <- p + xlab(names(df)[colx]) + ylab(names(df)[coly])
}
Y <- reactive({
X
})
# create a basic plot
output$plotBasic <- reactivePlot(function() {
df <- Y()
print(createPlot(df, colx=input$xcolumn, coly=input$ycolumn))
})
})
library(shiny)
# Define UI for dataset viewer application
shinyUI(pageWithSidebar(
# Application title
headerPanel("My app!"),
# Sidebar with controls to select a dataset and specify the number
# of observations to view
sidebarPanel(
numericInput("obs", "Number of observations to view:", 13),
uiOutput("opt.x"), #dynamic UI
uiOutput("opt.y") #value comes from Server.R
),
# Show a summary of the dataset and an HTML table with the requested
# number of observations
mainPanel(
tabsetPanel(
tabPanel("Table", tableOutput("view")),
tabPanel("BasicGraph", plotOutput("plotBasic"))
)
)
))
希望有所帮助。