为啥 `R` 管道运算符 `|>` 在使用 Shiny 的反应式编程中不起作用?

Posted

技术标签:

【中文标题】为啥 `R` 管道运算符 `|>` 在使用 Shiny 的反应式编程中不起作用?【英文标题】:Why does the `R` pipe operator `|>` not work in the reactive programming using Shiny?为什么 `R` 管道运算符 `|>` 在使用 Shiny 的反应式编程中不起作用? 【发布时间】:2021-11-15 18:00:11 【问题描述】:

我想在最新版本的R 中使用管道运算符|>,同时使用Shiny 进行反应式编程。例如,当我像这样在server 函数中使用|> 时:

library(shiny)

ui <- fluidPage(
    textInput("age", "How old are you?"),
    textOutput("message")
)

server <- function(input, output, server) 
    message <- paste0("You are ", input$age) |> reactive()
    output$message <- renderText(message())


shinyApp(ui, server)

我收到此错误:

Listening on http://127.0.0.1:4346
Warning: Error in : `env` must be an environment
  56: <Anonymous>
Error : `env` must be an environment

当我像这样对服务器功能进行细微更改时,此错误已得到修复:

server <- function(input, output, server) 
        message <- reactive(paste0("You are ", input$age, " years old"))
        output$message <- renderText(message())

但是,我希望能够在我的Shiny 应用程序中使用管道运算符。我在闪亮的应用程序中使用 |&gt; 的方式有什么问题?

【问题讨论】:

【参考方案1】:

问题是,您将空表达式 传递给 reactive 的第一个参数(x 参数:reactive(x = ))。

使用上面的代码,管道|&gt; 将其表达式传递给reactive 的第二个参数env,这会导致您得到错误。见?reactive

这行得通:

library(shiny)

ui <- fluidPage(
  textInput("age", "How old are you?"),
  textOutput("message")
)

server <- function(input, output, server) 
  message <- paste0("You are ", input$age) |> reactive()
  output$message <- renderText(message())


shinyApp(ui, server)

【讨论】:

我认为reactive 应该始终与 一起使用。 reactive()reactive() 有什么区别? :) 区别描述在here(见例子)。 返回最后一个表达式的计算结果。在上述情况下NULL,它被传递给reactive 的x 参数。 你知道我什么时候应该和不应该使用reactive()吗? Joe Cheng 解释了他使用花括号here 的动机。那里的视频链接已关闭,但您现在可以找到它们here。我想我找不到比他更好的解释了。

以上是关于为啥 `R` 管道运算符 `|>` 在使用 Shiny 的反应式编程中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

R:在自编写的包中使用magrittr管道运算符

如何在 r 中使用 tidyverse 管道运算符复制相同的表达式?

为啥我应该在 Angular 订阅中使用 select 和管道?

如何用赋值运算符结束管道?

为啥不能在函数中使用“=” R 运算符?

为啥我在使用 ifstream 通过命名管道读取一行后得到 EOF?