2016-07-12 40 views
-1

Ich muss eine Funktion erstellen, die einen Variablennamen und eine Operation erhält und erstellt den Code in Sql ausgeführt werden. Ich schrieb eine Funktion:R- Funktion zum Einfügen von Text - NULL-Wort in ihm

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,' 
    ) 
} 

Mit Liste von Variablen und Operationen:

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

Ich betreibe eine Schleife:

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

Und ich bekomme:

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 

Welche ist fast in Ordnung, außer für das NULL-Wort. Ich würde gerne wissen, warum es gedruckt wird und wie man es vermeidet.

Antwort

1

Die Funktion cat() druckt Text direkt in den Standard-Ausgabestrom. Es gibt nichts zurück. Genauer gesagt gibt es immer einen NULL-Wert zurück, wie in der Dokumentation unter dem Value-Abschnitt angegeben wird. Daher druckt Ihr print()-Aufruf NULL, was bewirkt, dass ein schmuckloser NULL in dem Standardausgabe-Stream gedruckt wird.

Daher ist der NULL-Text nicht Teil der SQL, die Sie innerhalb texto() generieren. Das Auftreten von NULL auf Ihrer Konsole ist ein Artefakt von Ihrem fehlerhaften print() Aufruf, nichts mehr.

Sie können das Problem lösen, indem Sie den print() Aufruf vollständig entfernen. Es ist nicht notwendig, da cat() bereits den Text direkt auf die Standardausgabe druckt.

Da es jedoch kein Zeilenvorschub-Zeichen am Ende der generierten SQL enthalten, würde ich Ihnen einen zum cat() Anruf hinzufügen vorschlagen, indem es als zweites Argument der variadische Argumentliste genommen von cat() vorbei. So haben wir:

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, 

Für mehr auf R Rückgabewert Sichtbarkeit, würde ich empfehlen http://rfunction.com/archives/799 zu lesen, und die beiden Funktionen invisible() und withVisible().