【问题标题】:Reading same data frame in a loop in shiny在闪亮的循环中读取相同的数据帧
【发布时间】:2018-08-02 22:32:35
【问题描述】:

我是 Shiny 的新手。假设我有一个需要循环运行的函数。它需要两个输入,一个是变化的,另一个是不变化的数据框。具体来说,我会写一个简化的函数和输入。

vec1 = rnorm(100)
vec2 = rnorm(100)


input = data.frame(vec1,vec2)


trial1 = function(input,b){
  vec1 = input$vec1
  return(vec1 + b)
}


trial2 = function(n,input){
d = rep(0,n)
for(i in 1:n){
b = rnorm(100)
d[i] = b + trial1(input = input, b = b) 
}
return(mean(d))
}

在此代码中,输入数据帧在循环中被重复读取,从而减慢了代码速度。是否可以使用闪亮的反应性,以便仅从输入中读取一次 vec1,因为输入在每个循环中都不变?让 trial1 反应式完成这项工作(并且“输入”作为输入或另一个反应性函数/值进入)?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    通常对于 R-Shiny 应用程序,您的大部分反应都在服务器函数中

    server <- function(input, output) {
       # your reactive components
    }
    

    您总是可以创建一个在这个闪亮的服务器函数之外初始化的全局变量

    vec1

    并在服务器块中访问它,因此您只需阅读一次

    【讨论】:

    • 在这种情况下,trial1 也是一个用户定义的函数,将作为输入。用户肯定会从输入数据帧中读取 vec1(在将其用于他的函数中的其他目的之前),而不是作为全局变量。我刚刚采用了最简单的函数来说明问题。
    • 然后你需要变得更复杂一些,并缓存向量。因此,每次触发时,您都需要检查输入参数与上次触发时是否发生了变化。如果是,则重新生成 vec1,否则保持 vec1 之前的状态
    • 如何在不进入 trial1 函数的情况下缓存向量?请注意,在此函数 (trial1) 中,输出仅取决于数据帧输入。情况可能并非如此。我将稍微更改示例以使我的观点更清楚。
    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多