如何在 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
功能。我用了caTools
。 processx
、xfun
和 base64enc
包中也有版本。 (xfun
中的那个实际上被命名为 base64_decode
。)这就是为什么在 Whosebug 上显示 可重现的 代码很重要。 reprex
包使这变得非常简单。
我有一个 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
功能。我用了caTools
。 processx
、xfun
和 base64enc
包中也有版本。 (xfun
中的那个实际上被命名为 base64_decode
。)这就是为什么在 Whosebug 上显示 可重现的 代码很重要。 reprex
包使这变得非常简单。