以下功能失败:
get_num <- function(input$num){ans <-input$num
return(ans)}
因为R被$
符号混淆了。
虽然这是一个玩具示例,但我想编写一个直接获取被动输入值的函数(在这种情况下是一个数字)并对它们执行一些有意义的操作,而不必使用
来抢占这种情况。num <- input$num
get_num <- function(num){ans <-num
return(ans)}
这甚至可能吗?
答案 0 :(得分:2)
这里有三点:
reactive()
而不是function()
。 以下是示例:
num_square = reactive({input$num^2})
observe(print(num_square()))
第一行定义基于input$num
的新反应值,第二行在其更改后立即打印。请注意,反应值与函数相同,您应该在它们前面使用()
调用它们。
<<-
而不是=
或<-
表示法。以下是一个例子:
reactive1 <- reactive({num_square <<- input$num^2
print(num_square) })
一旦您在代码中的某个位置运行num_square
,上述行就会更改reactive1()
的值。请注意,如果不运行reactive1()
,num_square
的值就不会更改。这是reactive()
(懒惰评估)和observe()
(急切评估)之间的巨大差异。
observe()
是另一种在函数中使用反应值的方法。 在我看来,你正在寻找这个。 这是一个例子。只要在程序中更改输入$ 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()
,因为它现在是一个函数。