根据 Shiny 中的 checkboxGroupInput 更新数据帧中的二进制列值

Update binary column values in a dataframe based on checkboxGroupInput in Shiny

提问人:Hack-R 提问时间:1/10/2015 最后编辑:Hack-R 更新时间:1/10/2015 访问量:420

问:

我在声明中有一长串复选框。复选框的标签和值对应于 DataFrame 中 的子集。checkboxGroupInputcolnames

例如,调用了 DataFrame 并具有如下列:userdf

A    B    C
1    1    0

如果名称是,那么我想修改数据帧,以便如果它包含但不包含或:checkboxGroupInputsotagsinput$sotagsABC

A    B    C
1    0    0

我对此的蹩脚尝试是:

for(i in 1:colnames(userdf)){
   if(colnames(userdf[i]) %in% paste(input$sotags)){userdf[,i] <- 1}
   if(!colnames(userdf[i]) %in% paste(input$sotags)){userdf[,i] <- 0} 
}

如果你想看到我的整个工作代码,它在这里:https://github.com/hack-r/coursera_shiny

r 闪亮

评论


答:

1赞 Marat Talipov 1/10/2015 #1

我认为这应该给出与您的代码相同的结果:

userdf[,input$sotags] <- 1
userdf[,! colnames(userdf) %in% input$sotags] <- 0

但这将导致一个所有行都相等的数据框...... 你为什么需要它?

评论

0赞 Hack-R 1/10/2015
谢谢,我会试一试!只有 1 行。原因是我做了一个预测算法,然后我让用户输入预测变量的值,看看它预测它们将属于 2 个类别中的哪一个。由于它仅针对 1 个用户的预测,因此只有 1 行。
0赞 Hack-R 1/10/2015
我给了你 +1 的帮助,会把它留在那里,但嗯,它说Error in .getReactiveEnvironment()$currentContext() : Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
0赞 Marat Talipov 1/10/2015
在没有可重现示例的情况下,我使用了与您在尝试中所做的相同的变量,其中变量的存在清楚地表明所呈现的代码属于反应式表达式/观察者之一。但是,该错误表明我的答案中的代码是在反应式表达式/观察者之外执行的,因此它显然是放错位置的。input$
0赞 Hack-R 1/10/2015
我应该把它放在哪里?我尝试了有和没有反应式表达式,但两种方式都出错了。指向可重现示例的链接在问题中。
1赞 John Paul 1/10/2015 #2

假设你在代码中从 开始,它不是响应式的,就像这样userdf

userdf<-data.frame(A=NA,B=NA,C=NA)

并且是您的列名之一。input$sotagscheckboxGroupInputcharacter

然后,您可以像这样创建一个新的 data.frame:

    userdf2<-reactive({
             as.data.frame(matrix(as.numeric(colnames(userdf)==input$sotags),nrow=1,
                  dimnames=list(NULL,colnames(userdf)))
     })    

编辑添加:

如果是字符向量,则可以在开始的行中替换 with,这将在所有选定的列中放置一个 1。input$sotags==%in%as.data.frame

评论

0赞 Hack-R 1/10/2015
谢谢。好的,所以当我按照你的假设添加这段代码时,我首先得到一个列名错误:然后当我单击显示表格的选项卡时(我只是为了测试目的而这样做),它说.实际上,我有一个想法,我会尝试看看它是否能修复错误。如果要测试它,代码和数据将在问题中链接。可以在 RStudio 中非常快速地将存储库克隆为一个项目。Error in colnames(userdf2()) <- colnames(userdf) : invalid (NULL) left side of assignmentWarning in toJSON(unclass(x), container, collapse, ..., .level = .level + :
0赞 Hack-R 1/10/2015
两个更新:您可以忽略相关的警告,我修复了它,这不是您的代码中的错误,而且我关于如何修复错误的想法也不起作用JSONcolnames
0赞 John Paul 1/10/2015
@Hack-R 刚刚编辑以摆脱部分。列名称在这里至关重要吗?我会尝试想办法添加它们。colnames
0赞 John Paul 1/10/2015
@Hack-R,我认为该位应该可以修复它。如果您愿意,可以添加行名称来代替 。dimnamesNULL
0赞 Hack-R 1/10/2015
谢谢,我现在正在测试它。问题是我有一个保存的模型,该模型在具有某些列名的变量上训练。它实际上是在预测你是否会得到Stackoverflow问题的答案,并且是你帖子上的标签列表。标记的名称是训练数据帧中的名称,行是二进制标志,用于指示标记是否存在。因此,在这里,我将用户指示他们拥有的标记的复选框转换为与训练数据帧结构相同的 1 行数据帧。有意义?randomForestinput$sotagscolnames