我有一个Shiny应用程序,正在从我的mongo DB导入数据。我正在使用Shinymanager软件包进行身份验证。
我遇到的问题是,数据在用户登录之前导入一次,而在用户登录之后再次导入。
目标是仅一次提取数据集。可以在用户登录之前或之后。
gloabl.R
urlm = #"myMongoUrl"
df.orats = mongo(collection = "df.orats", db = "test", url = urlm, verbose = T)
df.finalVol = mongo(collection = "df.finalVol", db = "test", url = urlm, verbose = T)
df.pass = mongo(collection = "df.pass", db = "test", url = urlm, verbose = T)
Server.R
function(input, output, session) {
secure_server(check_credentials = check_credentials(z))
df.f = df.orats$find()
df.h = df.finalVol$find()
df.new = reactive({
df.h %>% filter(Price, Ivol)
})
}
我正在寻找类似于req(check_credentials)之类的东西。
我尝试使用。
observerEvent(req(check_credentials(z),{
df.f = df.orats$find()
df.h = df.finalVol$find()
df.new = reactive({
df.h %>% filter(Price, Ivol)
})
})
但是数据仍然被导入两次。 任何意见是极大的赞赏。
下面是@Siddharth Arthi的代码,因为他正在帮助我。我添加了一行代码来打印结果。如您所见,认证前后的结果均为假。
secure_server(check_credentials = check_credentials(z))
returns <- check_credentials(z)
observe({print(returns("results")[1])})
答案 0 :(得分:1)
不是使用check_credentials()函数作为事件,而是使用函数返回的结果来确认用户身份验证并从Mongo中获取数据。
原始代码的更新摘要:
returns <- check_credentials(z)
observeEvent(returns(result)[1],{
if(returns(result)[1]){
df.f = df.orats$find()
df.h = df.finalVol$find()
df.new = reactive({
df.h %>% filter(Price, Ivol)
})
}
})
observeEvent 将在传递的值得到更新时运行。但是,在我们的情况下,它需要运行一次,例如在用户登录后运行。上面的代码段将满足此条件。希望这会有所帮助!
编辑:根据约旦的输入进行更新。
userAuth <- secure_server(check_credentials = check_credentials(z))
observeEvent(userAuth$user,{
df.f = df.orats$find()
df.h = df.finalVol$find()
df.new = reactive({
df.h %>% filter(Price, Ivol)
})
})
默认情况下,secure_server
函数将在身份验证成功时返回以列表形式输入的用户名。我们可以尝试使用它作为触发来处理我们的数据。让我知道是否有帮助!