Р - Как передать функцию в качестве аргумента другой функции? - PullRequest
2 голосов
/ 28 марта 2019

У меня есть функция, которую я создаю так:

library(ggplot2)
plot_function <- function(data, x, y){
  ggplot(data, aes_string(x=x, y=y)) + 
    geom_line() + 
    scale_y_continuous(labels = scales::comma_format())
}

Я могу назвать это так:

df <- data.frame(date = seq(as.Date("2019/01/01"), as.Date("2019/01/05"),"1 day"), 
                 value = seq(.1,.5, .1))

df  

date        value      
2019-01-01    0.1         
2019-01-02    0.2         
2019-01-03    0.3         
2019-01-04    0.4 
2019-01-05    0.5

plot_function(df, x = "date", "value")

enter image description here

Но что, если бы я хотел позволить пользователю иметь возможность изменять ось Y в процентах. Как я могу позволить им заменить scales::comma_format()? Это не работает:

plot_function <- function(data, x, y, y_format){

  ggplot(data, aes_string(x=x, y=y)) + 
    geom_line() + 
    scale_y_continuous(labels = y_format)
}

plot_function(df, x = "date", "value", y_format = "scales::percent_format()")

Я получаю эту ошибку:

"Error in f(..., self = self) : Breaks and labels are different lengths"

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Другой вариант - настроить функцию с помощью аргумента ..., так что передача аргумента labels в scale_y_continuous необязательна:

plot_function <- function(data, x, y, ...) {

  ggplot(data, aes_string(x=x, y=y)) + 
    geom_line() + 
    scale_y_continuous(...)
}

# Pass nothing to scale_y_continuous
plot_function(mtcars, x = "cyl", y="hp")

# Add some big numbers to mtcars
mtcars$hp = 1e5 * mtcars$hp

# Pass a labels argument to scale_y_continuous to get comma formatted values
plot_function(mtcars, x = "cyl", y="hp", labels=scales::comma)
2 голосов
/ 28 марта 2019

попробуйте это:

plot_function <- function(data, x, y, y_format){

 ggplot(data, aes_string(x=x, y=y)) + 
 geom_line() + 
  scale_y_continuous(labels = y_format())

}

plot_function(df, x = "date", "value", y_format = scales::percent_format)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...