gpt4 book ai didi

以 Shiny 的方式渲染 ggvis 控件

转载 作者:行者123 更新时间:2023-12-04 11:15:28 26 4
gpt4 key购买 nike

我无法让输入 slider 在 Shiny 的应用程序中呈现在 ggvis 图中。在没有输入 slider 的情况下,这些图可以很好地渲染,但是在添加它之后会出现以下错误:

Listening on http://xxxxxxxxxxxxxx
Error in eval(expr, envir, enclos) : could not find function "compdat"

服务器.R:

library(shiny)
library(ggvis)

data<-data.frame(var1=rnorm(30,5,2.3),var2=rbeta(30,1.5,.8),var3=rnorm(30,10,2.5))

shinyServer(function(input, output,session) {

compdat<-reactive({data[, c(input$xInp,input$yInp)]})

vis1 <-reactive({

compdat %>% ggvis(x= ~compdat()[,1],y= ~compdat()[,2]) %>%
layer_points(fill:="red") %>% layer_smooths(span=input_slider(.1,1,id="scores_ui"))

})

vis1 %>% bind_shiny("scores",controls_id="scores_ui")

vis2<-reactive({

compdat %>% ggvis(x= ~compdat()[,1],y= ~compdat()[,2]) %>%
layer_points(fill:="red") %>% ayer_smooths(span=input_slider(.1,1,id="loadings_ui"))

})

vis2 %>% bind_shiny("loadings",controls_id="loadings_ui")

})

ui.R:


shinyUI(fluidPage(

title="PCA Explorer",
h2("Principal Component Explorer"),

fluidRow(
column(6,ggvisOutput("scores"),
uiOutput("scores_ui")),
column(6,ggvisOutput("loadings"),
uiOutput("loadings_ui"))
),

br(),

fluidRow(
column(6,h3("Component Selection"),selectInput('xInp',"X Variable",names(data)),
selectInput('yInp',"Y Variable",names(data),selected=names(data)[[2]])),
column(6,h3("Summary of Selected Data Points"),verbatimTextOutput("diagn"))

)
))

关于如何让 slider 渲染的任何见解都会很棒。我花了相当多的时间来挖掘这个问题。提前致谢

最佳答案

一个很好的例子展示了如何使用 selectizeInput 自定义 X/Y 轴变量,可以在 Movie Explorer example 中找到。 .

但是,包装 ggvis()响应式环境中的函数具有突出的缺点(或错误),即一旦更改 input$xInp$input$yInp , layer_smooths()停止对您的 slider 输入使用react。

您的代码的另一个潜在问题是 data ui.R 看不到.
您可能想创建一个 global.R包含您的 data 的文件目的。

下面我将介绍两种方法来与您的ggvis 进行交互。通过选择 X/Y 变量进行绘图。您可以在 server.R 中找到它们。 .

全局.R

data <- data.frame(var1=rnorm(30,5,2.3),
var2=rbeta(30,1.5,.8),
var3=rnorm(30,10,2.5))

用户界面
library(shiny)

shinyUI(fluidPage(

title="PCA Explorer",
h2("Principal Component Explorer"),

fluidRow(
column(6,
ggvisOutput("scores"),
uiOutput("scores_ui")),
column(6,
ggvisOutput("loadings"),
uiOutput("loadings_ui"))
),

br(),

fluidRow(
column(6,
h3("Component Selection"),
selectInput('xInp',"X Variable", choices=names(data),
selected=names(data)[[1]]),
selectInput('yInp',"Y Variable", choices=names(data),
selected=names(data)[[2]])
),
column(6,
h3("Summary of Selected Data Points"),
verbatimTextOutput("diagn"))
)
))

服务器.R
library(shiny)
library(ggvis)

shinyServer(function(input, output,session) {
# Approach 1: regenerate a compdat object once the input changes
# rename the X/Y variables to fixed names.
compdat <- reactive({
x <- data[, c(input$xInp, input$yInp)]
names(x) <- c("x", "y")
x
})

# NOTE that you use compdat here instead of compdat()
compdat %>% ggvis(x=~x, y=~y) %>%
layer_points(fill:="red") %>%
layer_smooths(span=input_slider(.1,1)) %>%
bind_shiny("scores", controls_id="scores_ui")

# Approach 2: wrap ggvis in a reactive environment
# This however, would stop to react to slider input
# once input$xInp or input$yInp changes.
vis2 <- reactive({
xvar <- prop("x", as.symbol(input$xInp))
yvar <- prop("y", as.symbol(input$yInp))

data %>% ggvis(x=xvar, y=yvar) %>%
layer_points(fill:="red") %>%
layer_smooths(span=input_slider(.1,1))
})

vis2 %>% bind_shiny("loadings", controls_id="loadings_ui")
})

两种方法都应该有效(好吧,几乎)。但是等等,一旦您更改 X/Y 变量,您可能会看到平滑层停止响应您的 slider 更改。

要解决此问题,请考虑以下解决方案。

解决方法2的问题

我之前提到的错误可以通过创建 sliderInput 来修复。在 ui.R .

用户界面
library(shiny)

shinyUI(fluidPage(

title="PCA Explorer",
h2("Principal Component Explorer"),

fluidRow(
column(6,
ggvisOutput("scores"),
uiOutput("scores_ui")
),
column(6,
ggvisOutput("loadings"),
uiOutput("loadings_ui"),
# Create a slider by Shiny, instead of by ggvis.
sliderInput('smooth_span',
h5("Smoothing span for plot 2"),
.1, 1, value=0.5)
)
),

br(),

fluidRow(
column(6,
h3("Component Selection"),
selectInput('xInp',"X Variable", choices=names(data),
selected=names(data)[[1]]),
selectInput('yInp',"Y Variable", choices=names(data),
selected=names(data)[[2]])
),
column(6,
h3("Summary of Selected Data Points"),
verbatimTextOutput("diagn"))
)
))

服务器.R
library(shiny)
library(ggvis)

shinyServer(function(input, output,session) {
# Approach 1: regenerate a compdat object once the input changes
# rename the X/Y variables to fixed names.
compdat <- reactive({
x <- data[, c(input$xInp, input$yInp)]
names(x) <- c("x", "y")
x
})

# NOTE that you use compdat here instead of compdat()
compdat %>% ggvis(x=~x, y=~y) %>%
layer_points(fill:="red") %>%
layer_smooths(span=input_slider(.1,1)) %>%
bind_shiny("scores", controls_id="scores_ui")

# Approach 2: wrap ggvis in a reactive environment
# This however, would stop to react to slider input
# once input$xInp or input$yInp changes.
vis2 <- reactive({
xvar <- prop("x", as.symbol(input$xInp))
yvar <- prop("y", as.symbol(input$yInp))
smooth.span <- input$smooth_span

data %>% ggvis(x=xvar, y=yvar) %>%
layer_points(fill:="red") %>%
# FIXED: use the value from the input object, instead of a input_slider
layer_smooths(span=smooth.span)
})

vis2 %>% bind_shiny("loadings", controls_id="loadings_ui")
})

最后的话

包装 ggvis进入响应式(Reactive)环境有一些缺点:
  • 降低性能:因为一旦因输入变量发生变化,就需要重新绘制整个图形。
  • 缺少过渡动画:因为重新绘制了整个图形,您看不到在方法 1 中看到的漂亮过渡效果。

  • 但是,它确实有几个优点:
  • 更高的灵 active :包装 ggvis在响应式(Reactive)环境中,AFAIK 目前是 仅限 如果您想动态更改 X-Y 轴标签(例如,取决于您的 input$xInp )。因为ggvis只计算和绑定(bind)数据到 ggvis对象一次,对轴标签所做的更改将不会实时反射(reflect)。但是,因为包装 ggvis在 react 性环境中导致整个图形重绘,不知何故标签也在重绘中更新。
  • 关于以 Shiny 的方式渲染 ggvis 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088248/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com