【问题标题】:Row replacement in tibbles小标题中的行替换
【发布时间】:2020-09-08 06:29:05
【问题描述】:

考虑以下一小段 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", "e", A[1, ])` 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”包后,我们的应用程序开始崩溃;深入研究代码,上面的行原来是问题的原因。所以,在安装一些新包之前,上面的代码按照我们的意图执行,在安装新包(带有依赖项)之后,我们得到了错误。重写代码不是什么大问题,但我想了解哪里出了问题,而且我对 tibbles 不太熟悉。难道这种类型的行替换在早期版本的 tibble 包中是可能的,但在最新版本中是不可能的?

【问题讨论】:

    标签: r shiny tidyverse tibble


    【解决方案1】:

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

    • 列表或数据框/tibble
    • 它们的列名应与原始 tibble (A) 相同
    • 它们应该具有与原始 tibble 相同的类 (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
    

    【讨论】:

    • 谢谢。我意识到有一些方法可以解决这个错误——我对首先导致错误的原因更加好奇,因为我发布的代码直到昨天都可以工作,现在突然不行了。
    • tibbletidyverse 通常对类型和名称都比较严格。我想这又是一个例子。我不知道昨天在贵公司服务器上发生的所有更改导致事情无法正常工作,但我猜 tibbles 允许更早地进行此类行更改,现在他们已经按照最初的原则停止了这些更改。顺便说一句,该代码适用于数据框 (A = data.frame(animal = 'cat',color = 'black',weight = 1000)),但由于 tibbles 更严格,因此不允许发生此类更改。
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 2015-09-28
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多