R - Получить список таблиц, соответствующих шаблону регулярных выражений в пользовательской функции - PullRequest
1 голос
/ 30 января 2020

I sh для создания пользовательской функции в R, которая объединяет несколько таблиц, использующих регулярные выражения для поиска этих таблиц. В моей ситуации я хочу объединить все таблицы в моей среде, начиная с «m _».

Это дает именно то, что я хочу:

Reduce(function(...) merge(..., all = TRUE), mget(apropos("^m_")))

Но это не работает, когда я попытка преобразовать этот код в пользовательскую функцию:

    multi.merge <- function(...){
        x <- Reduce(function(...) merge(..., all = TRUE), mget(apropos(...))
        return(x)
}

dt <- multi.merge("^m_")

Ошибка: значение для 'm_table1' не найдено

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

Есть ли способ заставить эту работу работать?

Ответы [ 2 ]

1 голос
/ 30 января 2020

Попробуйте отправить фиксированный аргумент в функцию.

multi.merge <- function(pattern){
   Reduce(function(...) merge(..., all = TRUE), mget(ls(pattern = pattern))
   #Or
   #Reduce(function(...) merge(..., all = TRUE), mget(apropos(pattern))
}


dt <- multi.merge("^m_")
0 голосов
/ 30 января 2020

Мы можем использовать reduce будет full_join

library(dplyr)
library(purrr)
multi.merge <- function(pattern) {
        mget(ls(pattern = pattern, envir = .GlobalEnv), envir = .GlobalEnv)  %>%
              reduce(full_join)
  }

dt <- multi.merge("^m_")

данные

m_table1 <- structure(list(col1 = 1:5), class = "data.frame", row.names = c(NA, 
-5L))

m_table2 <- structure(list(col1 = 2:7, value = c(0.620061606036922, -0.833792752750578, 
-0.939990781455841, 0.00275725433910228, 1.40140753383493, 0.708695548097395
)), class = "data.frame", row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...