2016-07-14 3 views
3

Je codais brillamment avec le package rgl et shinyRGL, essayant de tracer un tracé linéaire 3D en demandant aux utilisateurs d'insérer un fichier csv d'un format spécifique. Mais l'erreur de fermeture du type d'objet continue à apparaître. Il semble que parce qu'il ne peut pas trouver la fonction plot3d, ou je peux me tromper.objet de type 'fermeture' ne peut pas être subdivisé en brillant. Travailler sur une simple fonction de traçage RGL

Voici le code:

UI

library(shiny) 
library(rgl) 
library(shinyRGL) 

# Define UI for application that draws a histogram 
shinyUI(fluidPage(
    titlePanel("title panel"), 

    sidebarLayout(
    sidebarPanel(
     helpText("Please select a CSV file with the correct format."), 
     tags$hr(), 
     fileInput("file","Choose file to upload",accept = c(
     'text/csv', 
     'text/comma-separated-values', 
     'text/tab-separated-values', 
     'text/plain', 
     '.csv', 
     '.tsv', 
     label = h3("File input")) 
    ), 
    tags$hr(), 
    checkboxInput('header', 'Header', TRUE), 

    actionButton("graph","PLOT!") 
    ), 


mainPanel(textOutput("text1"), 
      webGLOutput("Aplot"))) 
) 
) 

serveur

library(shiny) 
library(rgl) 
library(shinyRGL) 

options(shiny.maxRequestSize = 9*1024^2) 
shinyServer(
    function(input, output) { 


    output$text1 <- renderText({ 
    paste("You have selected", input$select) 
    }) 
    output$"Aplot" <- renderWebGL({ 
     inFile <- reactive(input$file) 
     theFrames <- eventReactive(input$graph,read.csv(inFile$datapath, 
header = input$header)) 
plot3d(theFrames[[4]],theFrames[[5]],theFrames[[6]],xlab="x",ylab="y",zlab 
= "z", type = "l", col = ifelse(theFrames[[20]]>0.76,"red","blue")) 
    }) 
}) 

Erreur

Attention: hinyRGL paquet a été construit sous la version 3.3.1 de R Attention: Erreur dans [[: objet de type 'fermeture' ne subsettable trace de la pile (la plus interne en premier): 70: plot3d 69: Func [C: \ Users \ workspace Ian \ \ Copie Leap SDK/test \ app_1/server.R # 19] 68: sortie $ Aplot 1: RunApp

+0

Ce n'est pas qu'il ne peut pas trouver la fonction, il est que quelque part dans ces fonctions que vous essayez de sous-ensemble d'une fermeture (fonction), ce qui ne fonctionne évidemment pas. Essayez d'échanger des termes dynamiques sous-définis avec des espaces réservés statiques (tout ce que vous savez permettra à la fonction de fonctionner) afin que vous puissiez déterminer quel terme est à l'origine du problème. – alistaire

+0

@alistaire Il semble que le problème soit dans mon paramètre XYZ "theFrames [[...]]". Mais je ne sais pas ce qui le cause ou comment le réparer. –

+0

Qu'est-ce que 'str (theFrames)'? – alistaire

Répondre

5

Rappelez-vous ce message d'erreur, car il est très typique pour les applications brillantes.

Cela signifie presque toujours que vous aviez une valeur réactive, mais que vous ne l'avez pas utilisée avec des parenthèses.

En ce qui concerne votre code, je repéré cette erreur ici:

inFile <- reactive(input$file) 
theFrames <- eventReactive(input$graph,read.csv(inFile$datapath, 
    header = input$header)) 

plot3d(theFrames[[4]],theFrames[[5]],theFrames[[6]],xlab="x",ylab="y",zlab 
    = "z", type = "l", col = ifelse(theFrames[[20]]>0.76,"red","blue")) 

Vous utilisez inFile comme une variable normale, mais ce n'est pas. C'est une valeur réactive et doit donc être appelée avec inFile(). La même chose vaut pour theFrames, que vous avez appelé avec theFrames[[i]], mais devrait être appelée avec theFrames()[[i]].

Ainsi, la version correcte serait

inFile <- reactive(input$file) 
theFrames <- eventReactive(input$graph,read.csv(inFile()$datapath, 
    header = input$header)) 

plot3d(theFrames()[[4]],theFrames()[[5]],theFrames()[[6]],xlab="x",ylab="y",zlab 
    = "z", type = "l", col = ifelse(theFrames()[[20]]>0.76,"red","blue")) 

Peut-être quelques informations supplémentaires sur le message d'erreur: Shiny évalue les variables que si elles sont nécessaires, de sorte que le theFrames réactif, contenant l'erreur, est exécutée à l'intérieur du plot3d fonction. C'est pourquoi le message d'erreur vous dit quelque chose au sujet de l'erreur étant dans plot3d, même si l'erreur se situe ailleurs.

+0

J'ai corrigé l'erreur 'fermeture' suite à ce que vous avez dit, merci beaucoup. Mais maintenant il me donne une autre erreur de massage en disant: 'Attention: Erreur dans le côté gauche <-: invalide (NULL) de l'affectation Trace de pile (la plus profonde en premier): 69: func [C: \ Utilisateurs \ Ian \ workspace \ Copie de Leap SDK Test \ App_1/server.R # 15] 68: sortie $ Aplot 1: runApp ' –

+0

@IANLee Ensuite, vous avez probablement mis trop de '()' s dans votre code. Voir la réponse [ici] (http://stackoverflow.com/questions/35769388/reactives-invalid-null-left-side-of-assignment). –

0

Je vous recommande de regarder vos conventions de nommage. J'ai toujours vu cette erreur quand j'utilise le nom de variable même que les noms de toute fonction définie dans les paquets ou toute fonction définie par moi.

Par exemple:

header = input$header 
inFile = input$file 

Vous devez toujours restreindre vous à utiliser ce genre de noms, il sera toujours utile.

Merci :)