Передача вектора в качестве аргумента в pl / r для запуска цикла for - PullRequest
0 голосов
/ 12 декабря 2018

Необходимо инициировать for loop, используя аргумент vector в pl/r.Код выглядит следующим образом:

DROP TYPE IF EXISTS tsdata CASCADE;
CREATE TYPE tsdata
AS
(
  a text,
  b text,
  c text,
  d text 
);


DROP FUNCTION IF EXISTS standard.create_pd_ts(data char, dimnames char);
CREATE FUNCTION standard.create_pd_ts(data char, dimnames char)
  RETURNS setof tsdata AS
$$
  drv <- dbDriver("PostgreSQL")
  conn <- dbConnect(drv, dbname = 'abc')

  iq <- paste0("select * from data")
  data <-dbGetQuery(conn, iq)
  data <- data.frame(coef_db_res_tab)

  for(i in 1:length(dimnames)) {
      var = dimnames [i]
      uniquedim= unique(data[,i])
      assign(paste0('dim',i),uniquedim)
     }
  ## save dimensions in a vector
  dimvec<-paste0('dim',1:length(dimnames),collapse = ',')

  tsdata <- eval(parse(text=paste0("expand.grid(", dimvec, 
  ",stringsAsFactors = FALSE)")))
  return(tsdata)

$$
LANGUAGE 'plr';

select
  (q).a,    
  (q).b,
  (q).c,
  (q).d
from
  (
    select * from standard.create_pd_ts(‘data’, 'c("a","b","c","d")')
  ) q ;

Мотивом функции является поиск уникальных значений столбцов a, b, c и d;впредь сохраняйте значения для того же самого в векторе dimvec, после чего используйте уникальные значения каждого столбца, чтобы расширить сетку и создать все комбинации.Пробовал разные вещи, но цикл for не инициируется.Если я объявляю вектор dimnames внутри функции, он работает.

Также попытался объявить как массив, текст, объявив как вектор внутри функции.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 12 декабря 2018
select
  (q).a,    
  (q).b,
  (q).c,
  (q).d
from
  (

select * from standard.create_pd_ts('data', ARRAY['a','b','c','d'])  
  ) q ;

Это работает для меня.Спасибо моему боссу:)

...