我正在编写一个简单的闪亮应用程序。我正在尝试计算下面显示的几个变量的CV。
std1_cv<-reactive({std_data_out_rm() %>% filter(Content == "Std-01") %>%
select(outlier) %>% sapply(cv, na.rm = TRUE)})
std2_cv<-reactive({std_data_out_rm() %>% filter(Content == "Std-02") %>%
select(outlier) %>% sapply(cv, na.rm = TRUE)})
std3_cv<-reactive({std_data_out_rm() %>% filter(Content == "Std-03") %>%
select(outlier) %>% sapply(cv, na.rm = TRUE)})
std4_cv<-reactive({std_data_out_rm() %>% filter(Content == "Std-04") %>%
select(outlier) %>% sapply(cv, na.rm = TRUE)})
std5_cv<-reactive({std_data_out_rm() %>% filter(Content == "Std-05") %>%
select(outlier) %>% sapply(cv, na.rm = TRUE)})
std6_cv<-reactive({std_data_out_rm() %>% filter(Content == "Std-06") %>%
select(outlier) %>% sapply(cv, na.rm = TRUE)})
然后我要检查是否满足CV小于0.065的条件。所以我创建了一个结果向量。
std_cv<-reactive({c(std1_cv(), std2_cv(), std3_cv(), std4_cv(), std5_cv(), std6_cv())})
到目前为止,一切都很好。我想为每个元素设计一个for循环,以创建一个新的逻辑向量:
std_cv3 <- reactive({c()
for(std in std_cv()){
std <- c()
if(as.numeric(std_cv()[1]) < 0.065){
std_cv3()<-TRUE
}
else{std_cv3()<-FALSE}
}
})
问题是这似乎不起作用。我收到一条消息:
错误:分配左侧无效(NULL)
坦率地说,这是我的第一个闪亮应用程序,真让我感到茫然。我对此很陌生,我怀疑这个难题可能有一个简单的答案,这很尴尬。更令人尴尬的是,过去48个小时我一直在这里工作,我失去了所有希望。有什么建议么?谢谢您的帮助
答案 0 :(得分:0)
您不能将值存储在反应表达式本身中。
c() <- 1 # does not work
c <- c()
c <- 1 # does work
类似的事情应该起作用
std_cv3 <- reactive({
std_cv3 <- std_cv3()
for(std in std_cv()){
std <- c()
if(as.numeric(std_cv()[1]) < 0.065){
std_cv3<-TRUE
}
else{std_cv3<-FALSE}
}
std_cv3
})
您必须在最后一行中使用write std_cv3,因为将返回反应表达式中的最后一个变量。
正如评论中所述,我不建议使用称为c()的反应式表达式,因为c()在R中保留为Combine函数,并可能导致意外行为。始终使用像“ std_result_1”之类的解释预期结果的变量
答案 1 :(得分:0)
您可以避免循环,因为<
是矢量化的。
std_cv3 <- reactive({
std_cv() < 0.065
})