小标题中的行替换

问题描述

考虑以下R代码小段:

A = tibble(animal = 'cat',color = 'black',weight = 1000)

A[1,] <-   gsub("a","e",A[1,])

我想要的是带有条目'cet','bleck'和1000的单行tibble,但是尝试在加载了tibble 3.0.3的情况下运行它会出现错误

Error: Assigned data `gsub("a",])` must be compatible with row subscript `1`.

x 1 row must be assigned.

x Assigned data has 3 rows.

ℹ Row updates require a list value. Do you need `list()` or `as.list()`?*

...我想这是有道理的,因为gsub会产生一个长度为3的字符向量。

这是我的问题:这段代码只是我在公司服务器上运行的R Shiny应用程序的一小部分。昨天,管理员在服务器上安装了“ photobiology”软件包后,我们的应用开始崩溃;深入研究代码,发现上面的几行是问题的原因。因此,在安装一些新软件包之前,上面的代码已按照我们的预期执行,在安装新软件包(带有依赖项)之后,我们遇到了错误。重写代码不是什么大问题,但是我想了解出了什么问题,并且对小技巧也不太熟悉。可以在tibble软件包的早期版本中使用这种行替换,但在最新版本中不能吗?

解决方法

当您更新小标题行时,它希望您通过

  • 列表或数据框/标题
  • 它们的列名应与原始小标题(A)相同
  • 它们应该与原始小标题(A)具有相同的类

这是为了确保保持数据一致性并且不会更新错误的值。

将所有这些组合在一起,您可以做到:

tmp <- as.data.frame(t(gsub("a","e",A[1,])))
tmp <- type.convert(tmp,as.is = TRUE)
names(tmp) <- names(A)
A[1,]  <- tmp
A

# A tibble: 1 x 3
#  animal color weight
#  <chr>  <chr>  <dbl>
#1 cet    bleck   1000