2015-10-23 2 views
0
d_date <- "23-10-2015" 
mypreibnr(d_date) 

Et myibnr ne renvoie que yq. Le code ci-dessus me donne la sortieJe veux retourner un tableau de la fonction définie par l'utilisateur myibnr. J'ai des problèmes pour retourner le tableau

"2015-16 Q3" 

J'ai présenté le code ci-dessous pour une plage de lignes. J'obtiens une erreur mettant en évidence les lignes paste0 dans la fonction myibnr. Je retourne l'exercice pour une date donnée. ibnr_data [, 7] est la colonne de date requise et ibnr_data [i, 8] est la colonne de sortie requise.

i=1 
while(i<=nrow(ibnr_data)){ 
d_date <- ibnr_data[i,7] 
mypreibnr(d_date) 
i <- i+1 
} 

mypreibnr <- function(d_temp){ 
temp <- dmy(d_temp) # passed as t in myibnr(a,t) 
b <- substr(year(temp),4,4) 
myibnr(b,temp) 

myibnr <- function(a, t){ 
temp1 <- dmy(str_replace("01-04-201x","x",a)) 
temp2 <- dmy(str_replace("30-06-201x","x",a)) 
temp3 <- dmy(str_replace("01-07-201x","x",a)) 
temp4 <- dmy(str_replace("30-09-201x","x",a)) 
temp5 <- dmy(str_replace("01-10-201x","x",a)) 
temp6 <- dmy(str_replace("31-12-201x","x",a)) 
temp7 <- dmy(str_replace("01-01-201x","x",a)) 
temp8 <- dmy(str_replace("31-03-201x","x",a)) 
yyy <- substr(t,1,3) 
ay <- as.numeric(a) 
ay_0 <- ay-1 
ay_1 <- ay+1 
qt <- which(unlist(list(between(t,temp1,temp2),between(t,temp3,temp4),between(t,temp5,temp6),between(t,temp7,temp8)))) 
if(qt<=3){ 
    yq <- paste0(yyy,ay,"-",yyy,ay_1," Q",qt,sep="") 
    } else { 
    yq <- paste0(yyy,ay_0,"-",yyy,ay," Q",qt,sep="") 
    } 
    ibnr_data[i,8] <- yq 
} 
+1

Il serait utile si vous fournissez un petit exemple reproductible et une sortie attendue basée sur cela. – akrun

+0

Il est également recommandé d'inclure tous les packages que vous utilisez. dans ce cas 'stringr' et' dplyr' ou 'data.table'. – r2evans

Répondre

0

Trois problèmes avec votre code:

  1. Vous ne ferme jamais la première fonction, mypreibnr; ajoutez un }.

  2. Bien que ce soit technique/style seulement, votre indentation est incohérente et non standard; pensez à utiliser RStudio, ESS, ou autre chose qui automatise l'indentation pour vous. Cela aurait probablement aidé aveC# 1.

  3. Vous assumez à tort que votre dernière ligne, ibnr_data[i,8] <- yq saura retourner tous de ibnr_data.

Pour le dernier (le coupable), se rendre compte que l'affectation à une variable dans R retourne invisiblement la valeur réellement affectée. Cela permet enchaînant d'affectation, de sorte que

x <- y <- 5 

attribue la valeur 5 à la fois x et y. Cela équivaut à

x <- (y <- 5) 

mettant en évidence le fait que l'attribution de 5-y est fait en premier, il retourne en silence un 5, qui est ensuite affecté à x (et invisiblement retourné). Si vous appliquez cette logique à votre code, vous verrez que

obnr_data[i,8] <- yq 

est affectant la valeur yq (une seule chaîne) à un membre du vecteur ibnr_data. Donc, c'est la chaîne unique (yq) qui est invisiblement retournée par l'affectation, pas le contenu de l'ensemble du vecteur. (Si vous aviez fait une assignation d'un vecteur de chaînes, alors cela aurait été retourné de manière invisible.)

Peut-être que l'ajout de ibnr_data fera ce dont vous avez besoin?