如何使用管道设置变量的 class?

How do I set the class of a variable using pipes?

我已经创建了一个函数,可以根据一些基本输入构建一个 tibble

library(tidyverse)
fun <- function(x, y) {
  tibble(
    start = x) %>%
  mutate(k = x * y)
}

我想做的是在这个函数中设置每个变量的 class

fun <- function(x, y) {
  tibble(
    start = x) %>%
  mutate(k = x * y) %>%
  mutate_at(vars(x, k), "currency")
}

我试过了

fun <- function(x, y) {
  tibble(
    start = x) %>%
  mutate(k = x * y) %>%
  class(k) <- "currency"
}

我的目标是创建一个包含 classes 的 tibble,以便稍后使用 openxlsx 包导出。我找到了很多使用 mutate_at 函数将因子转换为数字等的方法,但找不到在同一函数中定义 tibble(或数据框)变量的 class 的方法它是创建的功能。我知道我可以在脚本中很容易地做到这一点,但似乎我应该能够在一个函数中做到这一点。

"currency"class来自哪里?我能找到的最接近的是 formattable::currency(甚至 returns class "formattable" "numeric")。在这种情况下,您可以这样做:

library(dplyr)

fun <- function(x, y) {

  tibble(start = x) %>%
    mutate(k = x * y) %>%
    mutate_at(vars(start, k), formattable::currency)
}

fun(1:10, 2)
# A tibble: 10 x 2
#   start      k         
#   <formttbl> <formttbl>
# 1 .00      .00     
# 2 .00      .00     
# 3 .00      .00     
# 4 .00      .00     
# 5 .00      .00    
# 6 .00      .00    
# 7 .00      .00    
# 8 .00      .00    
# 9 .00      .00    
#10 .00     .00    

即使它来自一些不同的包,您也可以使用 class 中存在的默认方法执行相同的操作。例如,要将其更改为 "character" class,您可以使用:

fun <- function(x, y) {
   tibble(start = x) %>%
     mutate(k = x * y) %>%
     mutate_at(vars(start, k), as.character)
}

编辑

fun <- function(x, y) {

  data <- tibble(start = x) %>% mutate(k = x * y)
  data[c('k', 'start')] <- lapply(data[c('k', 'start')], 
                             function(x) {class(x) <- "Currency";x})
   return(data)
}

str(fun(1:10, 2))
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  10 obs. of  2 variables:
# $ start: 'Currency' int  1 2 3 4 5 6 7 8 9 10
# $ k    : 'Currency' num  2 4 6 8 10 12 14 16 18 20