首页 > 解决方案 > 使用 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 列数据框。向量的名称与数据框的列名不同。向量的名称是基于行的。

标签: rshiny

解决方案


我想到了两个(相似的)替代方案

第一个是什么都照着做,加两行代码

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))
})

我会将datareactiveValues 转换为列表,然后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()功能。

如果这不能满足您的应用程序的要求,请分享您的应用程序的更多详细信息,我会尽力帮助您。


推荐阅读