【问题标题】:using values from a reactive input to directly input into a custom function使用反应输入中的值直接输入到自定义函数中
【发布时间】:2015-01-03 12:52:27
【问题描述】:

以下函数失败:

get_num <- function(input$num){ans <-input$num 
                          return(ans)}

因为 R 被 $ 符号混淆了。

虽然这是一个玩具示例,但我想编写一个函数,它可以直接获取响应式输入值(在本例中为数字)并对它们执行一些有意义的操作,而不必使用

num <- input$num
get_num <- function(num){ans <-num 
                          return(ans)}

这可能吗?

【问题讨论】:

    标签: r function shiny


    【解决方案1】:

    这里分三点:

    1. 当您处理反应值时,您在脚本中使用reactive() 而不是function()

    示例如下:

    num_square = reactive({input$num^2})
    observe(print(num_square()))
    

    第一行基于input$num 定义了一个新的反应值,第二行在它改变时立即打印它。请注意,响应式值与函数相同,您应该在它们前面加上()

    1. 当您想将值保存到外部环境(除了内部使用的函数或反应式)时,您应该使用&lt;&lt;- 而不是=&lt;- 表示法。

    这是一个例子:

    reactive1 <- reactive({num_square <<- input$num^2
              print(num_square) })
    

    只要您在代码中的某个位置运行reactive1(),上述行就会更改num_square 的值。请注意,如果不运行 reactive1()num_square 的值不会改变。这是reactive()(惰性评估)和observe()(急切评估)之间的巨大差异。

    1. observe() 是在函数中使用反应值的另一种方法。 在我看来,您正在寻找这个。

    这是一个例子。只要您在程序中更改 input$num,get_num 的值就会发生变化。

    observe({get_num <<- input$num
             print(get_tmp)})
    

    注意上面的脚本应该在shinyServer(function(input, output) { ... })的中间。


    reactive()observe()的区别:[参考:http://shiny.rstudio.com/reference/shiny/latest/observe.html]

    观察者就像一个反应式表达式,因为它可以读取反应式 值并调用反应式表达式,并且会自动 当这些依赖关系发生变化时重新执行。但与反应式不同 表达式,它不会产生结果,也不能用作输入 到其他反应式表达。因此,观察者只对 它们的副作用(例如,执行 I/O)。

    反应式表达式和观察者之间的另一个对比是它们的 执行策略。反应式表达式使用惰性求值;那是, 当它们的依赖关系发生变化时,它们不会立即重新执行,而是 而是等到别人打电话给他们。确实,如果他们是 没有被调用,那么他们将永远不会重新执行。相比之下,观察者使用 热切的评价;一旦他们的依赖关系发生变化,他们就会安排 自己重新执行。

    【讨论】:

    • 好的,谢谢。为了保持清洁,我将删除我的 cmets 并邀请您也这样做。 :)
    【解决方案2】:

    试试:

    get_num <- function(ans = input$num) {
      out <- seq(ans:ans*2)
      return(out)
    }
    
    get_num()
    

    或:

    get_num <- function(ans) {
      out <- seq(ans:ans*2)
      return(out)
    }
    
    get_num(input$num)
    

    【讨论】:

    • 或许是一个小小的解释
    【解决方案3】:

    我认为在 Shiny 中更自然的方法是使用 reactive,如下所示:

    get_num<-reactive({ ans<-input$num)}
    

    显然你可以做更多,比如:

     get_num<-reactive({ans<-input$num*20
                        ans<-ans/pi
     })
    

    或其他。然后将您的值称为get_num(),因为它现在是一个函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2016-03-06
      • 2011-05-09
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多