2017-05-09 10 views
0

私は、次のアクションボタンでRを使用して表示したい画像のセットを持っています。次のボタンを使用してそれらを次々とどのように表示しますか?コードを実行するたびに、最初のイメージを表示することができますが、次のボタンをクリックすると、次のエラーが表示されます。警告:$のエラー: 'closure'タイプのオブジェクトはサブセット化できません。ここに私がこれまで持っていたコードがあります。R Shinyのファイルを次のタブを使って表示する

library(shiny) 
library(shinydashboard) 

dir_path <- '*/*' 
L <- list.files(dir_path, pattern = ".png") 

ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(), 
    dashboardBody(
    # Boxes need to be put in a row (or column) 
    fluidRow(
     box(
     title = "Controls", solidHeader = TRUE, status="primary",collapsible = TRUE, 
     actionButton("next_image","next") 
    ), 
     box(
     imageOutput("myimage",width=300,height=300) 
    ) 
    ) 

) 
) 

server <- function(input, output) { 

    values<-reactiveValues(data = NULL) 
    values$count <- 1 


    ntext <- eventReactive(input$next_image,{ 

    # Check if the counter `values$count` are not equal to the length of your questions 
    # if not then increment by 1 and return that image 
    # Note that initially the button hasn't been pressed yet so the `ntext()` will not be executed 
    if(values$count != length(L)){ 
     values$count <- values$count + 1 
     return(L[values$count]) 
    } 
    else{ 
     # otherwise just return the last image 
     return(L[1]) 
    } 
    }) 

    ntext <- eventReactive(input$next_image,{ 

    # Check if the counter `values$count` are not equal to the length of your questions 
    # if not then increment by 1 and return that image 
    # Note that initially the button hasn't been pressed yet so the `ntext()` will not be executed 
    if(values$count != length(L)){ 
     values$count <- values$count + 1 
     print(values$count) 
     return(renderImage({ 
      path<-file.path(paste('*/*',L[values$count], sep = "")) 

      return(list(src = path, 
         contentType = "image/png")) 
     }, 
     deleteFile = FALSE 
    )) 
    } 
    else{ 
     # otherwise just return the last image 
     return(L[length(L)]) 
    } 
    }) 
    output$myimage<- renderImage({ 
    if (input$next_image == 0){ 
    path<-file.path(paste(dir_path,L[1], sep = "")) 

    return(list(src = path, 
       contentType = "image/png"))} 

    ntext() 
    }, 
    deleteFile = FALSE 
) 

} 

shinyApp(ui, server) 

答えて

1

私が提案するすべての最初のコードを完全に再現可能にするために3枚のサンプル画像を作成する:(彼らは作業ディレクトリに保存されます)

# Create 3 sample pictures 
for(nr in 1:3){ 
    png(filename = paste0(nr, ".png")) 
    plot(nr) 
    dev.off() 
} 

お使いのサーバ機能は、少し複雑なようです。実際にあなたが必要なのは次のとおりです。作業アプリの

server <- function(input, output) { 

    values <- reactiveValues(count = 1) 

    observeEvent(input$next_image,{ 
     values$count <- min(values$count + 1, length(L)) 
    }) 

    output$plot3 <- renderImage({ 
    list(src = normalizePath(paste0(values$count, ".png"))) 
    }, deleteFile = FALSE) 

} 

(。私はあなたが他の.pngが作業ディレクトリに保存されていない、ここで前提としています)

は以下を参照:

# Create 3 sample pictures 
for(nr in 1:3){ 
    png(filename = paste0(nr, ".png")) 
    plot(nr) 
    dev.off() 
} 
L <- list.files(getwd(), pattern = ".png") 

library(shiny) 
library(shinydashboard) 
ui <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(), 
    dashboardBody(
    # Boxes need to be put in a row (or column) 
    fluidRow(
     box(
     title = "Controls", solidHeader = TRUE, status="primary",collapsible = TRUE, 
     actionButton("next_image","next") 
    ), 
     box(
     imageOutput("plot3",width=300,height=300) 
    ) 
    ) 

) 
) 

server <- function(input, output) { 

    values <- reactiveValues(count = 1) 

    observeEvent(input$next_image,{ 
     values$count <- min(values$count + 1, length(L)) 
    }) 

    output$plot3 <- renderImage({ 
    list(src = normalizePath(paste0(values$count, ".png"))) 
    }, deleteFile = FALSE) 
} 

shinyApp(ui, server) 
関連する問題