web-dev-qa-db-fra.com

ne peut pas contraindre le type "fermeture" au vecteur de type "caractère"

J'essaie de construire un nuage de points interactif en utilisant brillant. En utilisant les données de l'iris, j'aimerais qu'un utilisateur sélectionne les dimensions x et y d'un nuage de points * pétale vs sépale), puis génère un simple nuage de points des dimensions sélectionnées. Assez simple.

J'ai d'abord eu besoin de construire une fonction qui me permette de passer des chaînes représentant les dimensions à ggplot. Je l'ai fait et l'ai testé avec des données statiques. Fonctionne bien.

Ensuite, je définis deux listes déroulantes et deux chaînes suivantes (en utilisant brillant) pour les dimensions des pétales et des sépales (ce sont mes axes x et y).

J'ai ensuite défini les deux variables de chaîne en utilisant la fonction reactive () de shiny en utilisant une instruction switch.

Cela semble être là où les choses tournent mal.

L'erreur que j'obtiens est: Erreur: impossible de contraindre le type 'fermeture' au vecteur de type 'caractère'

J'ai pris un certain nombre d'étapes pour déboguer mon code. J'ai d'abord branché des dimensions codées en dur (par exemple "Petal.Length") dans la dernière ligne de ma sortie de code $ myplot = renderPlot ({myplotfunct (...

Cela fonctionne très bien. L'intrigue se présente comme je l'attends.

J'ai ensuite ajouté une ligne de débogage pour suivre la valeur de la chaîne que je passe cette fonction de tracé. Bingo. C'est vide. Pourquoi est-il vide ?? Il semble que la valeur du fichier UI.r doit être transmise.

Le code est ci-dessous.

Toute aide serait grandement appréciée. Merci!

I.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)})

})
12
Jeremy Pastore

L'appel à datasetInput1 et datasetInput2 dans les deux dernières lignes est la raison de l'erreur.

Vous devez plutôt appeler datasetInput1 () et datasetInput2 (). Sinon, R essaie de convertir la fonction en char.

En ajoutant simplement le (), l'erreur disparaît comme vous pouvez le voir ci-dessous:

enter image description here

10
faidherbard