Функция, которая возвращает именованный список с формулой (~) тильда и символы - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь создать функцию, которая может возвращать размеры для plotly графика параллельных координат . Короче говоря, эта функция ожидает размеры в структуре следующим образом:

df %>%
  plot_ly(type = 'parcoords',
          line = list(color = "blue"),
          dimensions = list(
              list(values = ~ column_01),
              list(values = ~ column_02),
              list(values = ~ column_03)
              # etc...
            )
          )

Например, учитывая data.frame (например, iris), я хотел бы вернуть структуру списка, которая выглядит следующим образом:

# Desired results
list(
  list(values = ~ Sepal.Length),
  list(values = ~ Sepal.Width),
  list(values = ~ Petal.Length),
  list(values = ~ Petal.Width),
  list(values = ~ Species)
)

Я близко, но у меня проблемы с formula (~) частью:

library(tidyverse)
get_dimensions <- function(df) {
  map(names(df), ~ list(values = rlang::sym(.)))
}

get_dimensions(iris) %>% str
# List of 5
#  $ :List of 1
#   ..$ values: symbol Sepal.Length
#  $ :List of 1
#   ..$ values: symbol Sepal.Width
#  $ :List of 1
#   ..$ values: symbol Petal.Length
#  $ :List of 1
#   ..$ values: symbol Petal.Width
#  $ :List of 1
#   ..$ values: symbol Species

В качестве альтернативы, если кто-то знает способ автоматической передачи всех столбцов элемента data.frame в качестве измерений на заговор участков, пожалуйста, сообщите!

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Если мы проверим str желаемого вывода OP, это будет formula объект

str(out1)
#List of 5
# $ :List of 1
#  ..$ values:Class 'formula'  language ~Sepal.Length
#  .. .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
# ...

, и формулы / ы могут быть непосредственно созданы из строк после переноса с помощью as.formula или formula.Разница заключается в среде

Формулы, созданные с помощью оператора ~, используют среду, в которой они были созданы.Формулы, созданные с помощью as.formula, будут использовать аргумент env для своего окружения.

Здесь мы paste или str_c (из stringr) тильда (~) со строкамипосле цикла между строками (names) с помощью map и создания проверки formula

library(purrr)
library(stringr)
get_dimensions <- function(df) {
   map(str_c("~", names(df)), ~ list(values = as.formula(.x)))
}
out2 <- get_dimensions(iris) 

с желаемым выходом OP ('out1')

all.equal(out1, out2)
#[1] TRUE
1 голос
/ 03 июля 2019

Я использовал call() для создания формулы.

library(magritrr)
get_dimensions <- . %>%
    names() %>%
    lapply(as.name) %>%
    lapply(function (x) list(values = call("~", x)))

get_dimensions(iris)
# [[1]]
# [[1]]$values
# ~Sepal.Length
#
#
# [[2]]
# [[2]]$values
# ~Sepal.Width
# 
# 
# [[3]]
# [[3]]$values
# ~Petal.Length
# 
# 
# [[4]]
# [[4]]$values
# ~Petal.Width
# 
# 
# [[5]]
# [[5]]$values
# ~Species
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...