kan type ‘sluiting’ niet dwingen tot vector van type ‘karakter’

Ik probeer een interactieve scatterplot te bouwen met behulp van shiny. Met behulp van de irisgegevens zou ik graag willen dat een gebruiker de x- en y-dimensies van een spreidingsplot *bloemblad versus kelkblad selecteert en vervolgens een eenvoudige spreidingsgrafiek van de geselecteerde afmetingen uitvoert. Vrij eenvoudig.

Eerst moest ik een functie bouwen waarmee ik strings die de dimensies vertegenwoordigen kan doorgeven aan ggplot. Ik deed dit en testte het met statische gegevens. Werkt prima.

Vervolgens definieer ik twee vervolgkeuzelijsten en twee opeenvolgende reeksen (met behulp van glanzend) voor de afmetingen van bloemblad en kelkblad (dit zijn mijn x- en y-as).

Vervolgens stel ik de twee stringvariabelen in met behulp van de reactieve() functie van shiny met een switch-statement.

Hier lijkt het mis te gaan.

De fout die ik krijg is: Fout: kan type ‘sluiting’ niet dwingen tot vector van type ‘karakter’

Ik heb een aantal stappen ondernomen om fouten in mijn code op te sporen. Ik heb eerst hard gecodeerde dimensies (bijv. “Petal.Length”) aangesloten op de laatste regel van mijn code output$myplot = renderPlot({myplotfunct( …

Dit werkt prima. De plot wordt weergegeven zoals ik verwacht.

Vervolgens heb ik een debug-regel toegevoegd om de waarde te volgen van de string die ik deze plotfunctie doorgeef. Bingo. Het is leeg. Waarom is het leeg?? Het lijkt erop dat er een waarde uit het UI.r-bestand moet worden doorgegeven.

Code staat hieronder.

Alle hulp wordt zeer op prijs gesteld. Bedankt!

UI.R

library(shiny)
# Define UI for dataset viewer application
shinyUI(fluidPage(
# Application title
titlePanel("Shiny Text"),
# Sidebar with controls to select a dataset and specify the
# number of observations to view
sidebarLayout(
  sidebarPanel(
    selectInput("dataset1", "Choose a Sepal Measure:", 
              choices = c("Sepal Length", "Sepal Width")),
    selectInput("dataset2", "Choose a Petal Measure:", 
              choices = c("Petal Length", "Petal Width"))
 ),
 # Main Scatter Plot
 mainPanel(
   textOutput("testvar"),
   plotOutput("myplot")
   )
  )
))

Server.R

library(shiny)
library(datasets)
library(ggplot2)
#Define a function to plot passed string variables in ggplot
myplotfunct = function(df, x_string, y_string) {
  ggplot(df, aes_string(x = x_string, y = y_string)) + geom_point()
}
shinyServer(function(input, output) {
# Sepal Inputs
datasetInput1 <- reactive({
  switch(input$dataset1,
       "Sepal Length" = "Sepal.Length",
       "Sepal Width" = "Sepal.Width")
})
# Petal Inputs
datasetInput2 <- reactive({
  switch(input$dataset2,
       "Petal Length" = "Petal.Length",
       "Petal Width" = "Petal.Width")
})
#Debug print value of sting being passed
output$testvar = renderText(print(datasetInput1))
# Plot
output$myplot = renderPlot({myplotfunct(iris, datasetInput1, datasetInput2)})
})

Antwoord 1, autoriteit 100%

De aanroep van datasetInput1 en datasetInput2 in de twee laatste regels is de reden van de fout.

U moet in plaats daarvan datasetInput1() en datasetInput2() aanroepen.
Anders probeert R de functie om te zetten in char. Het zou moeten zijn:

#Debug print value of sting being passed
output$testvar = renderText(print(datasetInput1()))
# Plot
output$myplot = renderPlot({myplotfunct(iris, datasetInput1(), datasetInput2())})

De ()stelt je in staat om de waarde van het reactieve element te krijgen in plaats van interactie met het reactieve element zelf. Dit is een vrij fundamenteel concept met Shiny en als dat iets is dat je nog niet kent, kun je misschien de glanzende tutorial

Alleen door de () toe te voegen, verdwijnt de fout zoals je hieronder kunt zien:

Other episodes