r - 使用 reactiveValues 列表生成具有矢量名称的数据帧 - R Shiny
问题描述
我正在创建一个动态的 reactiveValues 向量列表,并希望获取一个数据框,其中包含向量名称的列名。
在我的情况下,向量的名称是由用户生成的,并且可以更改
e.g.
data<-reactiveValues()
vector1<-c("a", "b)
names(vector1)<-"test1"
vector2<-c("a", "b)
names(vector2)<-"test2"
data[[paste0(1)]]<-vector1
data[[paste0(2)]]<-vector2
bind_cols(data)
这会导致一个非常丑陋的对象,其中列名是“1”和“2”(使用 isolate(reactiveValuesToList(data)) 检查)
向量的名称隐藏在属性中
如果只返回数据(而不是 bind_cols(data)),那么attributes(data[[`1`]])$dimnames[[2]]
将返回向量的名称。
我怎样才能解决这个问题?
编辑:
本来就是个白痴。我真正想要的是返回一个 1 列数据框。向量的名称与数据框的列名不同。向量的名称是基于行的。
解决方案
我想到了两个(相似的)替代方案
第一个是什么都照着做,加两行代码
library(shiny)
library(dplyr)
isolate({
data <- reactiveValues()
vector1 <- c("a", "b")
names(vector1) <- "test1"
vector2 <- c("a", "b")
names(vector2) <- "test2"
data[[paste0(1)]] <- vector1
data[[paste0(2)]] <- vector2
l = reactiveValuesToList(data)
df = bind_cols(l)
colnames(df) = vapply(l, function(x) unique(na.omit(names(x))), FUN.VALUE = character(1))
})
我会将data
reactiveValues 转换为列表,然后bind_cols()
与列表一起使用,然后通过获取列表中向量的名称来获取列名l
。在这里你必须使用na.omit()
函数,因为当你这样做时
vector1 <- c("a", "b")
names(vector1) <- "test1"
只有第一个元素的名称为“test1”,另一个是NA
.
第二种选择是相同的,但将名称“test1”分配给vector1
vector1 <- c("a", "b")
names(vector1) <- rep("test1", length(vector1))
但是将所有元素放在同名的向量中感觉很奇怪。然后,您将执行相同的操作,但不使用该na.omit()
功能。
如果这不能满足您的应用程序的要求,请分享您的应用程序的更多详细信息,我会尽力帮助您。
推荐阅读
- c++ - Qt5: connect: How to use 'connect' in case the slot has less parameters than the signal
- firebase - 如何将 localhost 数据库与 firebase 数据库连接?
- go - Not() belongs wrong table
- unity3d - 使用 OpenVR + SteamVR 在 Unity 中设置 Oculus Rift
- mongodb - 使用聚合的 MongoDB 计数(分组后)给出错误:cmd.cursor 未定义
- java - Edit SharedPreference value from other class
- javascript - undefined return from a class instance - Java Script
- android - 使用 Kotlin 和 GSON 无限循环 Realm 序列化实体
- javascript - 如何获得下一个和上一个项目?
- r - Obtain previous level of ordinal factor in R