R: запустить цикл из 4 векторов для вывода 4 таблиц данных - PullRequest
0 голосов
/ 10 октября 2018

Все,

У меня есть 4 вектора V1, V2, V3, V4. Я хочу выполнить цикл в запросе SQL.Каждый вектор представляет собой список чисел в этом формате («8001», «8002», «8003») для моего запроса SQL.Если я сделаю vlist <- list(c(V1, V2, V3,V4)), он выдаст мне список

> vlist
[[1]]
[1] "'84035','84040','84037','84013','84036','84030','84026','84016','84020','84012','84019'"
[2] "'84010','84039','84029','84031','84022','84032','84044','84034','84041','84042','84043'"

запрос

 #my code for the SQL query
vQuery <- infuse("SELECT TOP (1000) [PKID]
                           ,[Equipment]
                           ,[Order]
                           ,[ActStartDate]
                           ,[ActFinDate]
                           ,[ActStartTime]
                           ,[ActFinTime]
                           FROM [sapData].[dbo].[SAP_IW_47]
                           where Equipment IN ({{Vectors}}) 
                           and OrdCat = 'ZWAR'
                           and AcTyAct like '%TUT'
                           and ActStartDate BETWEEN '{{start}}' AND '{{end}}'"
                           , Vectors= #???, start = startdate, end = enddate) 
      # make it a data table
      VectorQuery <- queryDataHub(vQuery)
      vTable <- data.table(VectorQuery)

Я хочу ввести V1, V2, ... в vQuery, где Vectors= #??.Теперь то, что я пытаюсь сделать, - это возможность цикла для выполнения кода, приведенного выше, и при выполнении кода vTable у меня выводится 4 таблицы данных V1table, V2 table, ..... Будет ли цикл forлучше всего для этого.Я могу скопировать и вставить весь код 4 разных раза, но хотел бы сжать его.

1 Ответ

0 голосов
/ 10 октября 2018

Рассмотрите возможность установки определенного метода для вашего процесса, который получает элемент вектора.Затем используйте lapply, которая является итерационной функцией, которая возвращает объект списка равной длины в качестве входных данных.

В отличие от цикла for, lapply позволяет избежать бухгалтерской задачи инициализации пустого списка и присвоения ему элементов на каждой итерации, что, впрочем, прекрасно подходит и для этого.

proc_query <- function(v) {
      vQuery <- infuse("SELECT TOP (1000) [PKID]
                           ,[Equipment]
                           ,[Order]
                           ,[ActStartDate]
                           ,[ActFinDate]
                           ,[ActStartTime]
                           ,[ActFinTime]
                           FROM [sapData].[dbo].[SAP_IW_47]
                           where Equipment IN ({{Vectors}}) 
                           and OrdCat = 'ZWAR'
                           and AcTyAct like '%TUT'
                           and ActStartDate BETWEEN '{{start}}' AND '{{end}}'"
                           , Vectors= v, start = startdate, end = enddate) 
      # make it a data table
      VectorQuery <- queryDataHub(vQuery)

      return(data.table(VectorQuery))
}

# LIST OF DATA TABLES
vTables <- lapply(vlist, proc_query)

В качестве альтернативы с for loop:

# INITIALIZE EMPTY LIST WITH DEFINED LENGTH
vTables <- vector("list", length(vlist))

for (i in seq_along(vlist)) {
   # UPDATE ELEMENTS
   vTables[[i]] <- proc_query(vlist[[i]])          # STILL CALLING DEFINED FUNCTION
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...