Boucle de Remplacement est de longueur nulle
J'ai un petit problème avec une boucle. Voici le code de la boucle:
for(i in 1:40) {
ret1 <- sample(vec, 40, replace=T)
if (i == 1) {
val[i] = Put[i]*(1+ret1[i])
} else (i > 1)
val[i] = ((val[i-1])+Put[i])*(1+ret1[i])
}
Le message d'erreur que je reçois est la suivante:
Error in val[i] = ((val[i - 1]) + Put[i]) * (1 + ret1[i]) :
replacement has length zero
Voici les données d'entrée:
val: is an empty shell to store values in
vec <- c(43.81, -8.3, -25.12, -43.84, -8.64, 49.98, -1.19, 46.74, 31.94,
-35.34, 29.28, -1.1, -10.67, -12.77, 19.17, 25.06, 19.03, 35.82,
-8.43, 5.2, 5.7, 18.3, 30.81, 23.68, 18.15, -1.21, 52.56, 32.6,
7.44, -10.46, 43.72, 12.06, 0.34, 26.64, -8.81, 22.61, 16.42,
12.4, -9.97, 23.8, 10.81, -8.24, 3.56, 14.22, 18.76, -14.31,
-25.9, 37, 23.83, -6.98, 6.51, 18.52, 31.74, -4.7, 20.42, 22.34,
6.15, 31.24, 18.49, 5.81, 16.54, 31.48, -3.06, 30.23, 7.49, 9.97,
1.33, 37.2, 22.68, 33.1, 28.34, 20.89, -9.03, -11.85, -21.97,
28.36, 10.74, 4.83, 15.61, 5.48, -36.55, 25.94, 14.82, 2.07,
15.83)
Put = c(6180, 6365.4, 6556.362, 6753.05286, 6955.6444458, 7164.313779174,
7379.24319254922, 7600.6204883257, 7828.63910297547, 8063.49827606473,
8305.40322434668, 8554.56532107708, 8811.20228070939, 9075.53834913067,
9347.80449960459, 9628.23863459273, 9917.08579363051, 10214.5983674394,
10521.0363184626, 10836.6674080165, 11161.767430257, 11496.6204531647,
11841.5190667596, 12196.7646387624, 12562.6675779253, 12939.5476052631,
13327.7340334209, 13727.5660544236, 14139.3930360563, 14563.574827138,
15000.4820719521, 15450.4965341107, 15914.011430134, 16391.431773038,
16883.1747262292, 17389.669968016, 17911.3600670565, 18448.7008690682,
19002.1618951403, 19572.2267519945)
Ce que je fais mal /pas de compréhension de boucles?
Le but de tout cela est de calculer le retour historique sur un investissement dans le temps. J'ai l'intention d'investir un montant X de l'argent chaque année, et il y a un retour sur l'investissement. En outre, l'investissement l'investissement est composé.
Veuillez fournir une reproductibles code. Cela signifie que des données aussi bien. Et il avait de l'aide si vous expliquer ce que vous essayez de le faire (en mots) comme les gens d'ici peuvent contribuer à mieux / plus rapide / plus sûre des solutions (qui va aussi vous aider, vous et les autres).
Merci @Arun qui était nécessaire au conseil!
Merci @Arun qui était nécessaire au conseil!
else (i > 1)
devrait être else if (i > 1)
. Je pense que c'est votre problème.
OriginalL'auteur user1738753 | 2013-06-16
Vous devez vous connecter pour publier un commentaire.
Ici,
else (i > 1)
devrait êtreelse if (i > 1)
Fondamentalement, dès maintenant,
# statement 2
est exécutée pour tous lesi
. Leelse
déclaration ne prend aucun argument.Donc, ici
i > 1
est# do this 3
. Donc,# statement 2
est à l'extérieur la si-d'autre condition. Et je vais être exécuté pour tous lesi
. Mais l'erreur se produit lors de la première manche, pouri = 1
parce queval[i-1] = val[0] = numeric(0)
. Etnumeric(0) + Put[i])*(1+ret1[i]) = numeric(0)
de nouveau. Et vous êtes l'affectation de cettenumeric(0)
(élément de longueur 0) à un élément de longueur 1 qui n'est pas possible.Notez qu'une
if
déclaration peut avoir unelse
sanselse if
et que de nombreuxelse if
déclaration que nécessaire et n'ont pas besoin d'unelse
instruction à tous.OriginalL'auteur Arun