R-光泽中的ggplot2-如何从以前的绘图/图形中提取/获取/设置当前x/y/两个轴的范围?

R-光泽中的ggplot2-如何从以前的绘图/图形中提取/获取/设置当前x/y/两个轴的范围?,r,ggplot2,shiny,R,Ggplot2,Shiny,我用的是闪亮的包装。 我有一个ggplot2图形,只要用户更改输入,它的边界就会自动更新。我有一个控件,上面写着“修复当前轴范围” 我希望控件确定上一个闪亮图形的当前x和/或y范围,并将其用作即将创建的新图形的输入。 我计划使用类似于coord_cartesian的函数来修复所需的边界 另一个选择是简单地拥有一个函数,可以选择修复x、y或两个边界,但我没有幸运地找到一个 如何做到这一点 -------------更新--------------- 尝试使用全局变量失败,因为coord_carte

我用的是闪亮的包装。 我有一个ggplot2图形,只要用户更改输入,它的边界就会自动更新。我有一个控件,上面写着“修复当前轴范围”

我希望控件确定上一个闪亮图形的当前x和/或y范围,并将其用作即将创建的新图形的输入。

我计划使用类似于coord_cartesian的函数来修复所需的边界

另一个选择是简单地拥有一个函数,可以选择修复x、y或两个边界,但我没有幸运地找到一个

如何做到这一点

-------------更新---------------

尝试使用全局变量失败,因为coord_cartesian没有返回我期望的结果。它返回什么(我找不到文档)

——————代码片段---------------
#全局变量
亚克斯
#渲染图
如果(输入$yaxis==“默认值”){

y如果您不介意当前的范围是全局的,即强制所有活动用户使用,您可以将当前大小分配给全局变量,例如在@Joe Cheng之后的
中,使用
将当前大小分配给全局变量,我重新阅读了范围界定一章,并注意到我以前一直出错。这是一个更简单的版本;我删除了旧版本为了避免混淆,我为这个错误道歉

服务器.R
不清楚您所说的上一个图形是什么意思。这是在Shiny中完成的吗?是的,它是在Shiny中完成的。默认设置会自动调整边界以适应屏幕上的数据。我想让用户能够“锁定”边界。使用此选项:获取当前会话,然后使用redis或其他一些轻量级缓存(见鬼,甚至是sqlite3)要存储数据,您需要在那里引用数据,并在重新执行时将其拉回。这是每个会话,因此当会话关闭时,数据将消失。这是一条旧消息,较新的解决方案使用了会话参数。但是,它显然不用于存储用户变量。谢谢,我想应该有一个内置的机制来执行这些操作如果您希望每个会话使用它(我认为这实际上是您想要的,而不是每个用户),那么只需在
shinyServer(函数(输入、输出、会话){…})中声明值即可
和使用
从内部renderPlot分配看起来很棒!为了进一步解决问题,我们将如何隐藏“maxx”和“maxy”?我尝试在ui.r:tags$head(tags$script(HTML('Shiny.addCustomMessageHandler(“jsCode”,function(message){console.log(message)eval(message.code);});'))中添加这个(借用的)在server.r:session$sendCustomMessage(type=“jsCode”,list(code=paste($(“#”),maxx,”).hide(),sep=“”)中,我没有仔细研究过这一点,但要在ui.r中隐藏任何内容,可以将其包装在
标记$div(style=“display:none”,…)
。如果对输出执行此操作,默认情况下它们将自动停止计算,但输入应不受影响。谢谢,乔,我已经读了这一章半打了,现在才意识到它的内容。
#---------------SNIPPET---------------
#global variable
yaxis

#renderPlot 
if(input$yaxis == "default") {
    y <- coord_cartesian(ylim = c(-1, 1))
    yaxis <- y
}
else if(input$yaxis == "variable") {

    yaxis <- ggplot_build(q)$panel$ranges[[1]]$y.range
}
else if(input$yaxis == "fixed") {
    y <- yaxis
}

print(q + y)
shinyServer(function(input, output, session) {
  maxx = 1
  maxy = 1
  output$simpleplot <- renderPlot({
    input$nextButton # create dependency on action button
    scalex = round(runif(1,0.1,1),2)
    scaley = round(runif(1,0.1,1),2)
    fix = isolate(input$fixscale)
    
    if (fix){
      plot(runif(100,0,scalex),runif(100,0,scaley),pch=16,cex=0.5,
           xlim= c(0,maxx), ylim=c(0,maxy))
      
    } else {
      maxx <<- scalex
      maxy <<- scaley
      updateNumericInput(session,"maxx", value=scalex)
      updateNumericInput(session,"maxy", value=scaley)
      plot(runif(100,0,scalex),runif(100,0,scaley),pch=16,cex=0.5,
           col="red")    
    }  
  })
})
shinyUI(pageWithSidebar(
  headerPanel("FixScale Test"),
  sidebarPanel(
    checkboxInput("fixscale", "Fix Scale", FALSE),
    actionButton("nextButton", "Next"),
    br()
  ),
  mainPanel(
    plotOutput("simpleplot")
  )
))