Передать каскадную строку в качестве аргумента функции в R - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь создать объединенную строку и передать ее функции. Предположим, я хочу создать список фрейма данных, который я могу передать в функцию. Проблема заключается в том, что объединенная строка с использованием функции «noquote» обрабатывается как объект «noquote», а не как список, который мне нужен. Вот воспроизводимый пример. Если я определяю данные, используя data <- dflist1, то получаю то, что хочу, но когда я пытаюсь data1 <- noquote(paste0("dflist", selection)), он не возвращает тот же список.

Есть ли способ создать список так, как я хочу, только изменив selection?

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

Любые комментарии приветствуются!

a <- data.frame(aa = c(1,2,3), bb = c(4,5,6))
b <- data.frame(cc = c(11,12,13), dd = c(41,51,61))

dflist1 <- list(a, b)
dflist2 <- list(a, b, a, b)

selection <- "1"   # I want to make a choice here

data <- dflist1
data1 <- noquote(paste0("dflist", selection))

print(data1)
[1] dflist1

print(data)
[[1]]
  aa bb
1  1  4
2  2  5
3  3  6

[[2]]
  cc dd
1 11 41
2 12 51
3 13 61

class(data)
[1] "list"
class(data1)
[1] "noquote"

1 Ответ

3 голосов
/ 07 февраля 2020

Мы можем использовать get для возврата значений

get(data1)
#[[1]]
#  aa bb
#1  1  4
#2  2  5
#3  3  6

#[[2]]
#  cc dd
#1 11 41
#2 12 51
#3 13 61

Если мы проверим str(data1), поймем, что поверх «символа» он добавляет class noquote

str(data1)
#'noquote' chr "dflist1"

class(data1)
#[1] "noquote"

путем изменения атрибута

noquote
#function (obj, right = FALSE) 
#{
#    if (!inherits(obj, "noquote")) 
#        class(obj) <- c(attr(obj, "class"), if (right) c(right = "noquote") else "noquote")
#    obj
#}

paste0 возвращает имя объекта в виде строки, и нет необходимости использовать noquote. Просто оберните с get и он возвращает значение этого list или используйте mget, если есть несколько объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...