2017-06-23 19 views

答えて

3

tryCatchを使用して警告オブジェクトを格納できます。 これで、メッセージをUIの任意の場所に置くことができます。一度tryCatchとせずに他に:

library(shiny) 

ui <- fluidPage(
    actionButton("btn", "click me") 
) 

server <- function(input, output) 
{ 
    observeEvent(input$btn, { 
    #x <- (1:3 * 1:2) # this generates a warning 
    #warning("manually generated warning message") 
    #mess <- names(last.warning) 
    a <- tryCatch(warning(Sys.time()), warning=function(w) { w }) 
    mess <- a$message 
    showNotification(mess) 
    }) 
} 

runApp(list(ui=ui, server=server)) 

は、操作が重くされていない場合の両方のメッセージと値

を取得する、簡単な方法は、それを2回実行することです。

library(shiny) 

ui <- fluidPage(
    actionButton("btn", "click me") 
) 

server <- function(input, output) 
{ 
    observeEvent(input$btn, { 

    x <- tryCatch(1:3 * 1:2, warning=function(w) { w }) 
    if (inherits(x, "simpleWarning")) { 
     mess <- x$message 
     showNotification(mess) 
     x <- 1:3 * 1:2 
    } 
    print(x) 
    }) 
} 

runApp(list(ui=ui, server=server)) 

二度同じ操作を実行することは望ましくない場合は、次のトリック(See this SO thread

library(shiny) 

ui <- fluidPage(
    actionButton("btn", "click me") 
) 

server <- function(input, output) 
{ 
    withWarnings <- function(expr) { 
    myWarnings <- NULL 
    wHandler <- function(w) { 
     myWarnings <<- c(myWarnings, list(w)) 
     invokeRestart("muffleWarning") 
    } 
    val <- withCallingHandlers(expr, warning = wHandler) 
    list(value = val, warnings = myWarnings) 
    } 

    observeEvent(input$btn, { 
    x <- withWarnings(1:3 * 1:2) 
    if (!is.null(x$warnings)) { 
     for (w in x$warnings) showNotification(w$message) 

    } 
    }) 
} 

runApp(list(ui=ui, server=server)) 
+0

を使用し、私はあなたのコードを実行しようとしましたが、このメッセージました:警告:observeEventHandlerでのエラー:オブジェクトを'last.warning'が見つかりません。 –

+0

本当に。コンソールに警告メッセージが表示されますか? –

+0

ええと、私がactionButtonを押すと、光るアプリが閉じ、その警告がコンソールに表示されます。 –

関連する問題