2016-07-12 3 views
-1

Мне нужно создать функцию, которая получает имя переменной и операцию и создает код для запуска в sql. Я написал функцию:R- функция для вставки текста - NULL word внутри него

texto <- function(var,opera) { 
    paste0(
     opera, '(b.', var, ') as ', var, '_', opera, '_12,', '\n', 
     opera, '(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.', var, ' else 0 end) as ', var,'_', opera,'_6,', '\n', 
     opera, '(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.', var, ' else 0 end) as ', var,'_', opera,'_3,', '\n', 
     opera, '(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.', var, ' else 0 end) as ', var,'_', opera,'_1,' 
    ) 
} 

С списком переменных и операций:

vars <- list('vl_Saldo_Prom_Deu_Aco', 'vl_Saldo_Prom_Deu_Exc') 
ops <- list('sum', 'max') 

Я бегу цикл:

for (i in vars) { 
    for (j in ops) { 
     print(cat(texto(i,j))) 
    } 
} 

И я получаю:

sum(b.vl_Saldo_Prom_Deu_Aco) as vl_Saldo_Prom_Deu_Aco_sum_12, 
sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_sum_6, 
sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_sum_3, 
sum(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_sum_1,NULL 
max(b.vl_Saldo_Prom_Deu_Aco) as vl_Saldo_Prom_Deu_Aco_max_12, 
max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_max_6, 
max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_max_3, 
max(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_max_1,NULL 
sum(b.vl_Saldo_Prom_Deu_Exc) as vl_Saldo_Prom_Deu_Exc_sum_12, 
sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_sum_6, 
sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_sum_3, 
sum(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_sum_1,NULL 
max(b.vl_Saldo_Prom_Deu_Exc) as vl_Saldo_Prom_Deu_Exc_max_12, 
max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_max_6, 
max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_max_3, 
max(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_max_1,NULL 

Какие почти отлично, за исключением слова NULL. Я хотел бы знать, почему он печатается и как его избежать.

ответ

1

Функция cat() печатает текст непосредственно в стандартный выходной поток. Он ничего не возвращает. Вернее, точнее, он всегда невидимо возвращает значение NULL, так как документация заявлена ​​в разделе Value. Следовательно, ваш вызов print() печатает NULL, что приводит к тому, что в стандартный выходной поток будет напечатан незакрашенный NULL.

Следовательно, текст NULL не является частью SQL, который вы генерируете внутри texto(). Внешний вид NULL на консоли - это артефакт вашего ошибочного звонка print(), не более того.

Вы можете решить проблему, удалив полностью print(). Это необязательно, так как cat() уже печатает текст непосредственно на стандартный вывод.

Однако, поскольку нет перевода строки символов, включенных в конце сгенерированного SQL, я хотел бы предложить вам добавить один к cat() вызова, передав его в качестве второго аргумента VARIADIC списка аргументов, принятых cat(). Таким образом, мы имеем:

for (i in vars) for (j in ops) cat(texto(i,j),'\n'); 
## sum(b.vl_Saldo_Prom_Deu_Aco) as vl_Saldo_Prom_Deu_Aco_sum_12, 
## sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_sum_6, 
## sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_sum_3, 
## sum(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_sum_1, 
## max(b.vl_Saldo_Prom_Deu_Aco) as vl_Saldo_Prom_Deu_Aco_max_12, 
## max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_max_6, 
## max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_max_3, 
## max(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Aco else 0 end) as vl_Saldo_Prom_Deu_Aco_max_1, 
## sum(b.vl_Saldo_Prom_Deu_Exc) as vl_Saldo_Prom_Deu_Exc_sum_12, 
## sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_sum_6, 
## sum(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_sum_3, 
## sum(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_sum_1, 
## max(b.vl_Saldo_Prom_Deu_Exc) as vl_Saldo_Prom_Deu_Exc_max_12, 
## max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M6 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_max_6, 
## max(case when(b.cd_Anio*100+b.cd_Mes)>=a.cd_periodo_observacion_M3 then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_max_3, 
## max(case when(b.cd_Anio*100+b.cd_Mes)=a.cd_periodo_observacion then b.vl_Saldo_Prom_Deu_Exc else 0 end) as vl_Saldo_Prom_Deu_Exc_max_1, 

Более подробную информацию о R видимости возвращаемого значения, я рекомендую прочитать http://rfunction.com/archives/799, а две функции invisible() и withVisible().

Смежные вопросы