2016-04-18 5 views
7

Shinyモジュールを使用するためにシャイニーの古いアプリを移植したいと思っています。 documentationによると親のShinyサーバで反応的なデータセットを呼び出すシャイニーモジュール

目標は、彼らの 含むアプリケーションとの相互作用からモジュールを防ぐためではなく、これらの相互作用を明示的にするためにではありません。 モジュールが反応式を使用する必要がある場合は、反応式 式を関数パラメータとして使用します。

私は渡したいAPIなどからデータをインポートする既存の反応式を持っていますが、構文を見つけることはできません。下に与えられたShiny module exampleを修正すると、同じ問題が発生する可能性があります。

car_data()反応性の高いデータをモジュールに渡すことができるように、以下を変更できますか?私はisolatecar_data/car_data()のすべての組み合わせを試しました。私は考えることができ、困惑しています:)

私は、私の場合のようにデータを一般化しようとする必要はありません多数のデータセットに適用可能なETL関数。

library(shiny) 
library(ggplot2) 

linkedScatterUI <- function(id) { 
    ns <- NS(id) 

    fluidRow(
    column(6, plotOutput(ns("plot1"), brush = ns("brush"))), 
    column(6, plotOutput(ns("plot2"), brush = ns("brush"))) 
) 
} 

linkedScatter <- function(input, output, session, data, left, right) { 
    # Yields the data frame with an additional column "selected_" 
    # that indicates whether that observation is brushed 
    dataWithSelection <- reactive({ 
    brushedPoints(data(), input$brush, allRows = TRUE) 
    }) 

    output$plot1 <- renderPlot({ 
    scatterPlot(dataWithSelection(), left()) 
    }) 

    output$plot2 <- renderPlot({ 
    scatterPlot(dataWithSelection(), right()) 
    }) 

    return(dataWithSelection) 
} 

scatterPlot <- function(data, cols) { 
    ggplot(data, aes_string(x = cols[1], y = cols[2])) + 
    geom_point(aes(color = selected_)) + 
    scale_color_manual(values = c("black", "#66D65C"), guide = FALSE) 
} 

ui <- fixedPage(
    h2("Module example"), 
    linkedScatterUI("scatters"), 
    textOutput("summary") 
) 

server <- function(input, output, session) { 

    ### My modification 
    ### making the reactive outside of module call 
    car_data <- reactive({ 
    mpg 
    }) 

    ## This doesn't work 
    ## What is the syntax for being able to call car_data()? 
    df <- callModule(linkedScatter, "scatters", car_data(), 
        left = reactive(c("cty", "hwy")), 
        right = reactive(c("drv", "hwy")) 
) 

    output$summary <- renderText({ 
    sprintf("%d observation(s) selected", nrow(dplyr::filter(df(), selected_))) 
    }) 
} 

shinyApp(ui, server) 
+0

これは役立つ可能性があります:http://stackoverflow.com/a/36517069/4222792なぜ外部から反応的な呼び出しを行う必要がありますか?あなたのモジュールのいくつかは出力できませんか?あなたのdataImportApiは1つのモジュールですか? –

+0

ありがとうミカエル。その理由は、そのパッケージとして使用するための一般的なモジュールのためのものであり、私はそれに反応的なデータフレームを渡したいと思います。 – MarkeD

答えて

4

ドロップcar_data後の括弧:

df <- callModule(linkedScatter, "scatters", car_data, 
        left = reactive(c("cty", "hwy")), 
        right = reactive(c("drv", "hwy")) 
) 

モジュールは "未解決" の反応剤をたいているようです。かっこでそれらを「解決」します。

+1

ありがとうミステリーユーザー:) – MarkeD

3

モジュールの一部ではない入力を渡す場合は、tutorialに記載されているように、reactive()をラップしてください。モジュールは、モジュールの一部ではない入力にアクセスする必要がある場合

、 含むアプリは(すなわち反応性(...))の反応 表現に包まれた入力値を渡す必要があります。 callModule(myModule, "myModule1", reactive(input$checkbox1))

更新: のように正しく反応式を渡すために別の答えとJoe Cheng正しい方法で述べたがカッコなしで()

callModule(linkedScatter, "scatters", car_data)

1つの選択肢として、API入力機能をモジュール化して、モジュール外で反応式を定義する必要もありません。モジュール化された入力の例は、answerから見つけることができます。 正解のコードの下に。

library(shiny) 
library(ggplot2) 

linkedScatterUI <- function(id) { 
    ns <- NS(id) 

    fluidRow(
    column(6, plotOutput(ns("plot1"), brush = ns("brush"))), 
    column(6, plotOutput(ns("plot2"), brush = ns("brush"))) 
) 
} 

linkedScatter <- function(input, output, session, data, left, right) { 
    # Yields the data frame with an additional column "selected_" 
    # that indicates whether that observation is brushed 
    dataWithSelection <- reactive({ 
    brushedPoints(data(), input$brush, allRows = TRUE) 
    }) 

    output$plot1 <- renderPlot({ 
    scatterPlot(dataWithSelection(), left()) 
    }) 

    output$plot2 <- renderPlot({ 
    scatterPlot(dataWithSelection(), right()) 
    }) 

    return(dataWithSelection) 
} 

scatterPlot <- function(data, cols) { 
    ggplot(data, aes_string(x = cols[1], y = cols[2])) + 
    geom_point(aes(color = selected_)) + 
    scale_color_manual(values = c("black", "#66D65C"), guide = FALSE) 
} 

ui <- fixedPage(
    h2("Module example"), 
    linkedScatterUI("scatters"), 
    textOutput("summary") 
) 

server <- function(input, output, session) { 
data(mpg) 
    ### My modification 
    ### making the reactive outside of module call 
    car_data <- reactive({ 
    mpg 
    }) 

    ## This doesn't work 
    ## What is the syntax for being able to call car_data()? 
    df <- callModule(linkedScatter, "scatters", reactive(car_data), 
        left = reactive(c("cty", "hwy")), 
        right = reactive(c("drv", "hwy")) 
) 

    output$summary <- renderText({ 
    sprintf("%d observation(s) selected", nrow(dplyr::filter(df(), selected_))) 
    }) 
} 

shinyApp(ui, server) 
+0

ありがとう、これは働いたが、ジョーチェン自身が受け入れられた答えが "方法"であることを確認した。 – MarkeD

+0

@MarkeDああ、本当です。はい、それはそうでなければなりません。 car_dataは既に反応しています。私はこの答えも解決します。 –

関連する問題