Ошибка tidyr :: uncount () в пользовательской функции - PullRequest
0 голосов
/ 06 ноября 2019

Какую глупость я делаю здесь, когда использую tidyr::uncount в функции:

library(tidyverse)
library(tidyr)
df <- data.frame(a = c(2, 3, 4),
                   freq = c(3, 4, 5))
df
#   a freq
# 1 2    3
# 2 3    4
# 3 4    5
#WORKS
df2 <- df %>% 
    tidyr::uncount(freq)
df2
#     a
# 1   2
# 1.1 2
# 1.2 2
# 2   3
# 2.1 3
# 2.2 3
# 2.3 3
# 3   4
# 3.1 4
# 3.2 4
# 3.3 4
# 3.4 4

Но когда я помещаю это в функцию, я получаю ошибку Error: weights must evaluate to a numeric vector Called from: tidyr::uncount(., frequency_var).

my_fun <- function (x, frequency_var) {
  df2 <- df %>% 
    dplyr::select(x, frequency_var) %>% 
    tidyr::uncount(frequency_var)   %>% 
    dplyr::arrange(x)
  df2
}

my_fun("a", "freq")
Error: `weights` must evaluate to a numeric vector
Called from: tidyr::uncount(., frequency_var)

Моя freq переменная числовая?

1 Ответ

1 голос
/ 06 ноября 2019

Если вы вызываете его в функции, я бы посоветовал взглянуть на нестандартную оценку. Используя оператор curly-curly ({{}}) из rlang, мы можем передавать имена переменных без кавычек в функцию. Также лучше передать имя dataframe в функцию, чтобы получить правильный контекст.

library(rlang)

my_fun <- function (df, x, frequency_var) {
   df2 <- df %>% 
            dplyr::select({{x}}, {{frequency_var}}) %>% 
            tidyr::uncount({{frequency_var}})   %>% 
            dplyr::arrange({{x}})
    df2
}

my_fun(df, a, freq)

#   a
#1  2
#2  2
#3  2
#4  3
#5  3
#6  3
#7  3
#8  4
#9  4
#10 4
#11 4
#12 4
...