我有一个r脚本包含一个Identify_IP(),它返回一个dataframe和ggplot列表。我想调用脚本并渲染数据框和绘图。
这是Identify_IP()函数。我取消了不相关的代码,只保留了plot,lines和ggplot代码,给出了我的ggplot类型的清晰示例。
library(ggplot2)
library(matrixStats)
library(fda.usc)
#df <- read.table("name.XLS", header = FALSE)
Identify_IP = function(df1){
mlearn <- df1[,'V7']
formul <- plot(blue_curve$x, blue_curve$y * 30, type = 'l', col = 'blue')
formula_deriv <- lines(blue_curve$x, red_curve$y1 * 30, col = 'red')
p <- ggplot(df1, aes(blue_curve$x)) +
geom_line(aes(y = blue_curve$y, colour = "0 Deriv")) +
geom_line(aes(y = red_curve$y1, colour = "1st Deriv")) +
geom_vline(xintercept = x_loc) + geom_hline(yintercept = 0)
return(list(df1,p))
}
现在,这是一个基于amrr和micstr建议的修改后的Shiny代码。
source('InflectionP2.R', local = TRUE)
library(ggplot2)
library(shiny)
runApp(
list(
ui = fluidPage(
titlePanel("Upload your file"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose xls file',
accept = c(".XLS")),
actionButton("btn", "Update Table"),
actionButton("btn1", "Display Plot")
),
mainPanel(
tableOutput('what'),
plotOutput('pl'))
)
)
,
server = function(input, output, session){
dataOP <- reactive({
inFile <- input$file1
if (is.null(input$file1))
return(NULL)
dfs <- Identify_IP(read.table(inFile$datapath))
return(dfs)
})
observeEvent(input$btn, output$what <- renderTable({
dataOP()[[1]]
}))
observeEvent(input$btn1, output$pl <- renderPlot({
pp <- dataOP()
pp[[2]]
}))
}))
这对于教我如何在reactive()中调用r脚本非常有帮助。这对我来说很有意义。然而,它渲染表格,但“显示绘图”按钮不会渲染绘图。 Identify_IP函数中的ggplot是否与无法显示绘图有关?我也试过print(ggplot(pp [[2]]))并且仍然一样。
答案 0 :(得分:1)
我设法让这个工作。
注意我使用了内部数据集iris
并制作了玩具Identify_IP
功能,因为我没有您的代码。
请注意,您仍然需要选择一个文件来触发事件,但它会忽略该文件并使用iris
数据。
解决方法我使用[[1]]
来获取表格dataOP()$tble
<强> CODE 强>
library(shiny)
library(ggplot2)
# source('InflectionP2.R', local = TRUE)
# MAKE TEST FUNCTION
Identify_IP <- function(mydata) {
#shrink data
tble <- head(mydata)
plt <- ggplot(data = head(mydata),
mapping = aes(y = Sepal.Length,
x = Petal.Length)) + geom_point()
return(list(tble, plt))
}
runApp(
list(
ui = fluidPage(
titlePanel("Upload your file"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Choose xls file',
accept = c(".XLS")),
actionButton("btn", "Update Table"),
actionButton("btn1", "Display Plot")
),
mainPanel(
tableOutput('what'),
plotOutput('pl'))
)
)
,
server = function(input, output, session){
dataOP <- reactive({
inFile <- input$file1
if (is.null(input$file1))
return(NULL)
# ORIGINAL dfs <- Identify_IP(read.table(inFile$datapath))
# using internal dataset for example
dfs <- Identify_IP(iris)
# ORIGINAL list(tble = dfs, plt = dfs)
# lets just return your dfs, its already a list in code above
return(dfs)
})
observeEvent(input$btn, output$what <- renderTable({
#print(dataOP()) # debug line that led to [[1]] idea
# ORIGINAL dataOP()$tble
# just say first in list
dataOP()[[1]]
}))
observeEvent(input$btn1, output$pl <- renderPlot({
#ggplot(dataOP()$plt)
# since already a plot just need to index it
# I found [[2]] worked better than explicit dataOP()$plt
pp <- dataOP()
pp[[2]]
}))
}))
<强> RESULT 强>
瞧!
答案 1 :(得分:0)
1)尝试print (ggplot(dataOP()$plt))
2)很抱歉,如果没有ggplot
代码位和数据,很难解释。鉴于@amrrs问题,您可以尝试使用print()
和str()
临时行在您的Shiny代码中进行调试,以查看您的数据返回的内容。即。
print(dataOP()$plt)
str(dataOP())
更糟糕的情况是,尝试将您的代码分成两部分。因此,使用Identify_IP代码来执行数据处理,然后使用刚刚返回绘图的ggplot代码创建Print_IP。它可能排除你的图表不是问题。
3)看看reactiveValues()
https://shiny.rstudio.com/reference/shiny/0.11/reactiveValues.html
它&#34;烘烤&#34;结果是反应性的。图表中出现的类型可能是反应类型而非图表类型。也许分享您收到的任何错误消息。