如何在 dplyr::mutate 内以矢量化方式解码 base64 字符串?

How to decode base64 strings in a vectorized way within dplyr::mutate?

我有一个 tibble,其中包含一列 base64 编码的字符串,如下所示:

mytib <- tibble(encoded_var = c("VGVzdGluZ3Rlc3Rpbmc=", "QW5vdGhlcnRlc3Q="))

当我尝试用 base64::base64decode

解码它时
mytib %>%
     mutate(decoded_var = base64decode(encoded_var))

我收到一个错误:

Error in `mutate()`:
! Problem while computing `decoded_var = base64decode(encoded_var)`.
x `decoded_var` must be size 2 or 1, not 25.

我正在寻找包含一列已解码 human-readable base64 字符串的小标题。我还想使用 mutate tidyverse 语法来做到这一点。我怎样才能做到这一点?

更新:tibble 应该是这样的

# A tibble: 2 × 2
  encoded_var              decoded_var
  <chr>                    <chr>
1 VGVzdGluZ3Rlc3Rpbmc=     Testingtesting
2 QW5vdGhlcnRlc3Q=         Anothertest

base64enc::base64decode 生成原始向量,因此您需要按行执行转换并将结果用 rawToChar:

包装
mytib %>% 
  rowwise() %>% 
  mutate(decoded_var = rawToChar(base64decode(encoded_var)))
#> # A tibble: 2 x 2
#> # Rowwise: 
#>   encoded_var          decoded_var   
#>   <chr>                <chr>         
#> 1 VGVzdGluZ3Rlc3Rpbmc= Testingtesting
#> 2 QW5vdGhlcnRlc3Q=     Anothertest   

问题是 caTools::base64decode 函数一次只能处理一个字符串,因为一个字符串可能包含多个值。如果您的变量中始终只有一个字符值,那么您可以对其进行向量化:

library(tidyverse)
mytib <- tibble(encoded_var = c("VGVzdGluZ3Rlc3Rpbmc=", "QW5vdGhlcnRlc3Q="))
mytib %>%
     mutate(decoded_var = Vectorize(caTools::base64decode)(encoded_var, "character"))
#> # A tibble: 2 × 2
#>   encoded_var          decoded_var   
#>   <chr>                <chr>         
#> 1 VGVzdGluZ3Rlc3Rpbmc= Testingtesting
#> 2 QW5vdGhlcnRlc3Q=     Anothertest

reprex package (v2.0.1)

创建于 2022-03-14

编辑添加:实际上,有(至少)四个不同的包提供 base64decode 功能。我用了caToolsprocessxxfunbase64enc 包中也有版本。 (xfun 中的那个实际上被命名为 base64_decode。)这就是为什么在 Whosebug 上显示 可重现的 代码很重要。 reprex 包使这变得非常简单。