Как мне установить класс переменной, используя каналы? - PullRequest
0 голосов
/ 23 марта 2020

Я создал функцию, которая строит тиббл из нескольких основных c входных данных

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"
}

Моя цель - создать тиббл, включающий в себя классы для последующего экспорта с использованием пакета openxlsx. Я нашел много способов конвертировать из факторов в цифры c и др. c. используя функцию mutate_at, но не может найти способ определить класс переменной tibble (или фрейма данных) в той же функции, которую он создает. Я знаю, что могу сделать это в скрипте достаточно легко, но мне кажется, что я должен быть в состоянии сделать это внутри функции.

1 Ответ

1 голос
/ 23 марта 2020

Откуда взялся класс "currency"? Самый близкий, который я мог найти, был formattable::currency (даже это возвращает класс "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 $1.00      $2.00     
# 2 $2.00      $4.00     
# 3 $3.00      $6.00     
# 4 $4.00      $8.00     
# 5 $5.00      $10.00    
# 6 $6.00      $12.00    
# 7 $7.00      $14.00    
# 8 $8.00      $16.00    
# 9 $9.00      $18.00    
#10 $10.00     $20.00    

Даже если он из какого-то другого пакета, вы сможете сделать то же самое с методами по умолчанию, представленными в классе. Например, чтобы изменить его на "character" класс, вы можете использовать:

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
...