使用来自无功输入的值直接输入到自定义函数中

时间:2014-11-06 20:56:50

标签: r function shiny

以下功能失败:

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

因为R被$符号混淆了。

虽然这是一个玩具示例,但我想编写一个直接获取被动输入值的函数(在这种情况下是一个数字)并对它们执行一些有意义的操作,而不必使用

来抢占这种情况。
num <- input$num
get_num <- function(num){ans <-num 
                          return(ans)}

这甚至可能吗?

3 个答案:

答案 0 :(得分:2)

这里有三点:

  1. 当您处理被动值时,在脚本中使用reactive()而不是function()
  2. 以下是示例:

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

    第一行定义基于input$num的新反应值,第二行在其更改后立即打印。请注意,反应值与函数相同,您应该在它们前面使用()调用它们。

    1. 如果要将值保存到外部环境(其他内部使用函数或被动),则应使用<<-而不是=<-表示法。
    2. 以下是一个例子:

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

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

      1. observe()是另一种在函数中使用反应值的方法。 在我看来,你正在寻找这个。
      2. 这是一个例子。只要在程序中更改输入$ 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)。

             

        反应性表达与观察者之间的另一个对比是他们的   执行战略。反应性表达使用惰性评估;那是,   当他们的依赖关系改变时,他们不会马上重新执行,但是   而是等到别人打电话给他们。的确,如果是的话   没有打电话,他们永远不会重新执行。相比之下,观察者使用   急切的评价;一旦他们的依赖关系发生变化,他们就会安排   他们自己重新执行。

答案 1 :(得分:0)

尝试:

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)

答案 2 :(得分:0)

我认为以闪亮方式执行此操作的更自然的方法是使用reactive,如下所示:

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

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

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

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