Захват выражений внутри списков в виде текста - PullRequest
0 голосов
/ 10 мая 2018

В настоящее время у меня есть эта функция, которая берет таблицу и два списка выражений и оценивает их, превращая их в две матрицы. Я использую два списка вместо ..., потому что мне нужно иметь возможность определить, будут ли выражения падать в Y или Z.

func = function(tb, Y, Z) {
  Y_matrix = enquo(Y) %>% 
    eval_tidy(tb) %>%
    as.data.frame %>%
    as.matrix

  Z_matrix = enquo(Z) %>%
    eval_tidy(tb) %>%
    as.data.frame %>%
    as.matrix

  list(Y_matrix, Z_matrix)
}

Например:

> tb = data.frame(a = 1:3, b = 3:1, c = 2*(1:3))
> func(tb, list(a + b, a - b), list(a*c, a + b + c))
[[1]]
     c.4L..4L..4L. c..2L..0L..2L.
[1,]             4             -2
[2,]             4              0
[3,]             4              2

[[2]]
     c.2..8..18. c.6..8..10.
[1,]           2           6
[2,]           8           8
[3,]          18          10

Однако я также хочу записать выражения в списках в виде текста, чтобы я мог использовать их для именования столбцов. Например, мой желаемый результат будет выглядеть примерно так:

> func(tb, list(a + b, a - b), list(a*c, a + b + c))
[[1]]
             a+b            a-b
[1,]             4             -2
[2,]             4              0
[3,]             4              2

[[2]]
              a*c         a + b + c
[1,]           2           6
[2,]           8           8
[3,]          18          10

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете использовать что-то вроде deparse, чтобы просмотреть языковые элементы в вашем списке, чтобы превратить их в строки. Например

func = function(tb, Y, Z) {
  Y_names <- map_chr(as.list(enexpr(Y))[-1], deparse)
  Y_matrix = enquo(Y) %>% 
    eval_tidy(tb) %>%
    as.data.frame %>%
    set_names(Y_names) %>% 
    as.matrix

  Z_names <- map_chr(as.list(enexpr(Z))[-1], deparse)
  Z_matrix = enquo(Z) %>%
    eval_tidy(tb) %>%
    as.data.frame %>%
    set_names(Z_names) %>% 
    as.matrix

  list(Y_matrix, Z_matrix)
}

, который работает с этим примером

func(tb, list(a + b, a - b), list(a*c, a + b + c))
# [[1]]
#      a + b a - b
# [1,]     4    -2
# [2,]     4     0
# [3,]     4     2

# [[2]]
#      a * c a + b + c
# [1,]     2         6
# [2,]     8         8
# [3,]    18        10
0 голосов
/ 10 мая 2018

Мы могли бы передать аргументы как выражение, а затем выполнить оценку (!!!)

library(tidyverse)
f1 <- function(tb, Y, Z) {
       Y_matrix <-  tb %>% 
             transmute(!!! Y)

       Z_matrix <- tb %>%
             transmute(!!! Z)

       list(Y_matrix, Z_matrix)


   }

f1(tb, quos(a + b, a - b), quos(a*c, a + b + c))
#[[1]]
#  a + b a - b
#1     4    -2
#2     4     0
#3     4     2

#[[2]]
#  a * c a + b + c
#1     2         6
#2     8         8
#3    18        10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...