replacement has length zero in fibonacci sequence in R code - r

So I have this code for the fibonacci sequence, and I keep getting an error when I try to print out the value of the function.
fibonacci <- function(nn) {
if (!(nn%%1==0) | (nn<1)){
return(0)
}
my.fib <- c(1,1)
for (kk in 3:nn){
my.fib[kk] <- my.fib[kk-1] + my.fib[kk-2]
}
return(my.fib[nn])
}
fibonacci(7)
fibonacci(5)
fibonacci(1)
fibonacci(1.5)
fibonacci(0)
It prints everything correctly for 7,5,1.5 and 0, as it gives me the vaules 13, 5, 0, and 0. But when trying to print fibonacci(1), I get the error
Error in my.fib[kk] <- my.fib[kk - 1] + my.fib[kk - 2] :
replacement has length zero
I want to leave as much as the code the same as possible.

Add another if condition to check for nn = 1.
fibonacci <- function(nn) {
if (!(nn%%1==0) | (nn<1)){
return(0)
} else if(nn == 1) return(1)
my.fib <- c(1,1)
for (kk in 3:nn){
my.fib[kk] <- my.fib[kk-1] + my.fib[kk-2]
}
return(my.fib[nn])
}

Related

Manually written function doesn't behave the same as the gamma function

So I implemented a function that calculates the value of the gamma function. and when I try to multiply f5(a) with a numeric I receive the error : Error in result * f5(a) : non-numeric argument to binary operator and if I instead use result * gamma(a) which is the predefined function it works just fine. It seems like it won't let me do any arithmetic operation with f5 even though it returns the same result as gamma
f5 <- function(a)
{
f <- function(x)
x^(a-1)*exp(-x)
integrate(f, 0, Inf)
}
f6 <- function(a)
{
if (a < 0)
print("a is negative")
else if (a%%1 == 0)
return (factorial(a-1))
else
{
result <- 1
while (a > 1)
{
result <- result * (a - 1)
a <- a - 1
}
result <- result * f5(a)
result
}
}
gamma(0.3)
f5(0.3)
f6(0.3)
This is because of the class of object that gets returned from f5().
class(f5(0.3))
[1] "integrate"
This is a named list object, and you can call the specific value from it:
names(f5(a))
[1] "value" "abs.error" "subdivisions" "message" "call"
You want the value component. Modifying f6() to the code below makes it work:
f6 <- function(a){
if (a < 0){
print("a is negative")
}else if (a%%1 == 0){
return (factorial(a-1))
}else{
result <- 1
while (a > 1){
result <- result * (a - 1)
a <- a - 1
}
result <- result * f5(a)$value
result
}
}

Error in if (num < 0) { : missing value where TRUE/FALSE needed

y <- as.integer(readline(prompt ="Enter a number: "))
factorial = 1
if (y< 0){
print("Error")
} else if (y== 0)
{
print("1")
} else
{
for(i in 1:y) {
factorial = factorial * i
}
return(factorial)
}
wondering why this is giving:
Error in if (y< 0) { : missing value where TRUE/FALSE needed
is it cause the first line has data type NA_integer?
There are three possible ways to pass values to the if statement.
y <- 1
if (y > 0) print("more")
This one works as expected.
y <- 1:3
if (y > 0) print("ignores all but 1st element")
As the warning message will tell you, only the first element was used to evaluate it. You could use any or all to make this right.
y <- NA
if (y > 0) print("your error")
This case actually gives you your error. I would wager a bet that y is somehow NA. You will probably need to provide a reproducible example (with data and the whole shebang) if you'll want more assistance. Note also that it helps visually structure your code to improve readability.

Evaluating the output of a condition in R?

In the below R function, I was wondering how I could get R to evaluate whether the object input outputs n or es?
Note: I will need to know the exact output of input, so I canNOT be using identical() etc.
Here is what I have tried with no success:
d = function(n, es){
input = if(length(n) > 1) n else if(length(es) > 1) es else n
if(input == n) cat("yes") else cat("No") # IF `input` is `n` cat("yes") otherwise cat("no")
}
d(n = c(2, 3), es = 1)
try to use if(identical(n, input)) cat("yes") else cat("No"). == cannot be

Error message in Bubble sort code in R language

I did some programming work on R language to do the bubble sort. Sometimes it works perfectly without any error message, but sometimes, it shows "Error in if (x[i] > x[i + 1]) { : argument is of length zero". Can any one help me check whats wrong with it? I have attached my code below
example <- function(x) {
n <- length(x)
repeat {
hasChanged <- FALSE
n <- n - 1
for(i in 1:n) {
if ( x[i] > x[i+1] ) {
temp <- x[i]
x[i] <- x[i+1]
x[i+1] <- temp
hasChanged <- TRUE
cat("The current Vector is", x ,"\n")
}
}
if ( !hasChanged ) break;
}
}
x <-sample(1:10,5)
cat("The original Vector is", x ,"\n")
example(x)
The error occurs because you are iteratively decreasing n. Depending on the original vector's order (or lack thereof), n can reach the value of 1 after the last change. In that case, a further reduction of n in the next iteration step addresses the value x[0], which is undefined.
With a minimal correction your code will work properly, without giving error messages. Try to replace the line
if ( !hasChanged ) break;
with
if ( !hasChanged | n==1 ) break
Basically you have two termination criteria: Either nothing has been changed in the previous iteration or n is equal to one. In both cases, a further iteration won't change the vector since it is already ordered.
By the way, in R programming you don't need a semicolon at the end of a command. It is tolerated/ignored by the interpreter, but it clutters the code and is not considered good programming style.
Hope this helps.

0 vector result in R after running function

After I finished running my function, I kept on getting 0s as my answer:
niv_density <- function(returns, mu, delta, alpha, beta, t)
{
t <- 1/t
gamma <- sqrt(alpha^2 - beta^2)
result <- rep(0, (1/t))
for(i in 1:(1/t))
{
term3 <- exp(delta*gamma*t + beta*(returns[i] - mu*t))
term1 <- alpha*delta*t/pi
term2_1 <- besselY(alpha*sqrt(delta^2*t^2 + (returns[i] - mu*t)^2), 1)
term2_2 <- sqrt(delta^2*t^2 + (returns[i] - mu*t)^2)
term2 <- term2_1/term2_2
result[i] <- (term1*term2*term3)
}
}
niv_density(returns, 0, 2, 50, 0, 10)
result
After executing the last part, I get a vector of 0s. I think I'm having a problem with global vs. local scopes, but I'm not sure how to fix it.
dput(returns)
structure(c(-0.003859212, 0.011873365, -0.004826217, -0.004006846,
-0.004527209, -0.005597606, -0.001446292, 0.004890173, 0.001260653,
-0.005469839, 0.001715495, 0.00776223, -6.79514e-05, -0.002405413,
-0.00344927, 0.013203733, 0.009007395, -0.002918161, -0.000682757,
0.003600917, -0.001584568, 0.001778635, 0.003881849, -0.003228443,
0.00809855, -0.003407655, 0.006570117, -0.001629285, -0.001479157,
-0.000683758, 0.007489741, 0.007807378, 0.001399056, -0.000578823,
-0.002437511, -0.000593349, -0.004020762, 0.004744014, -0.001815119,
0.007757796, -0.002401808, -0.00225831, -0.005162853, -0.002256747,
0.032891919, 0.005882631, -0.011822966, -0.005744899, -0.004359233,
0.00405189, 0.017035644, 0.001079738, 0.001845759, -0.004758891,
0.006067706, -0.006027932, -0.00224155, -0.010844493, 0, -0.003861616,
-0.004698823, 0.000397524, 0.001840917, 0.013599978, -0.008376557,
1.92494e-05, 0.010797502, -0.004105023, 0.003119424, -0.004797368,
-0.001962367, 0.002663974, 0.008489008, 0.007827146, -0.000566674,
-0.003404669, -0.000160508, -0.003953786, -0.000635631, 0.0023086,
0.008931147, -0.002761431, 0.013046559, -0.009673618, 0.007572105,
-0.011309217, 0.003777911, -0.004767721, -0.004096769, 0.003915212,
-0.005571037, 0.008566323, -0.009063831, -0.011191246, -0.000639167,
0.002834983, -0.009156367, 0.00189252, 0.007166451, -0.001788182,
-0.002437146, 0.00226261, -0.010459432, -0.001511577, 0.00039628,
-0.00349739, 0.009561965, 0.063504871, 0.003492974, 0.009233691,
0.004795333, -0.003995969, -0.002552804, 6.81834e-05, 0.006134657,
0.006713932, -0.006875273, -0.005108732, 0.006239377, 0.002293386,
-0.01121192, -0.005666844, 0.000894577, -0.012511724, 0.00351622,
-0.009671627, -0.004480382, 0.007385228, -0.009143379, 0.005467177,
0.017094141, 0.005918621, 0.001514995, -0.001356959, 0.015656296,
0.001101646, 0.001457523, 0.0051402, -0.005516804, 0.002832519,
-0.002196811, -0.007752963, 0.009050809, 0.006380147, 0.001995102,
0.002319077, -0.001788715, 0.000845096, -0.009821598, 0.012634302,
-0.001457121, 0.000582262, -0.004083585, -0.004021717, -0.000571503,
0.006159289, -0.010822168, -0.015789222, -0.000657867, 0.013935285,
0.001312777, -0.001172312, 0.003031039, 0.002482838, -0.010634785,
0.014015267, 0.005435065, -0.034817949, 0.005145224, -0.007217488,
0.00458109, 0.012581199, 0.001853981, 0.002118571, -0.011151137,
-0.007933775, 0.011336262, 0.018212375, 0.007815775, 0.006103632,
-0.007270438, -0.001066825, 0.001892988, -0.009740379, 0.012057142,
0.00024459, -0.003702988, 0.014628744, -0.001902607, -7.49322e-05,
-0.005903797, -0.002481339, -0.004266069, 0.01150386, -0.019888508,
0.007657512, -0.004649027, 0, 0.002523089, -0.00072238, -0.021153782,
-0.007969763, 0.005775428, -0.010897333, 0.007468107, -0.009508927,
0.000464995, -0.002430182, 0.010796022, 0.008898853, -0.013079549,
0.027112561, -0.015413991, -0.007630787, 0.007033724, -0.017738864,
-0.015961032, -0.015579591, -0.011802317, -0.002187586, 0.003065715,
0.013389559, -0.000885034, -0.013701533, 0.001976838, 0.001041955,
-0.003616062, 0.005344799, 0.007148373, -0.002877552, -0.007681476,
0.021591165, 0.017966863, -0.058771073, -0.019551973, 0.005203616,
0.002169669, 0.003884158, -0.022568915, 0.002769004, -0.007779571,
0.018998803, -0.001212088, 0.002446011, 0.007740844, 0.012532807,
0.006287039, 0.003958813, 0.01407559, 0.001064047, -0.00862106,
-0.012296938, -0.013967015, 0.010524923, -0.010789529, 0.011953286,
0.000738662, -0.016492003, -0.00257709, -0.015437029, 0.004315983,
0.023337948, 0.008138125, 0.005972748, 0.005915635, 0.010493804,
-0.011895336, -0.005245454, 0.007409717, 0.012596218, -0.005221382,
-0.005462129, 0.008785043, 0.009134618, 0.015541224, 0.016072839,
-0.003827797, 0.000403703, 0.03749696, -0.003386946, -0.008627298,
-0.030790478, -0.003861794, -0.011426323, 0.001393173, 0.008541783,
0.009361445, -0.023851831, 0.024814864, -0.019724128, 0.002621807,
-0.017904622, -0.003584294, -0.019299804, -0.00234839, -0.002685042,
0.002685042, 0.016590137, 0.001401377, -0.006120481, 0.006690448,
-0.004740457, -0.005027981, 0.013204038, -0.002742491, 0.005110009,
-0.006393429, 0.00464228, -0.00270551, -0.011552836, 0.003074876,
0.005139878, 0.002032361, 0.007603533, 0.010491222, 0.000658875,
0.003909991, 0.00236732, 0.019192366, -0.00361624, 0.005696264,
-0.005852811, 0.014805765, 0.00313454, 0.006385073, -0.005475311,
-0.009195918, 0.008472618, -0.000559148, -0.007272851, 0.003748203,
0.001156269, 0.004328552, -0.006107929, -0.012121056, 0.002812434,
-0.009577213, 0.005689626, -0.001941957, 0.006145673, -0.002275509,
-0.006578825, -0.005345298, -0.000327811, 0.003751791, 0.005053343,
0.005157952, -0.022100394, -0.007461083, 0.003576376, 0.00093598,
0.006738706, 0.006976768, 0.001078282, -0.006256189, 0.003313743,
-0.005955287, 0.011771523, 0.001644383, -0.003459295, 0.032863111,
-0.007369908, -0.001099451, 0.004745151, 0.012094786, 0.001167328,
-0.00404787, -0.004345022, -0.001121192, 0.004333763, -0.008483142,
-0.001578184, -0.00046999, 0.005079249, -0.005970832, 0.005543307,
0.006722626, 0, 0.001715197, 0.011776868, 0.013308783, -0.004160112,
-0.000304697, 0.014924613, 0.007204855, -0.00509816, 0.007186504,
0.002287253, -0.009948655, -0.001000861, -0.00431929, -0.00347645,
0.005015994, -0.007540969, 0.00558486, -0.005661924, -0.006602168,
-0.002824197, 0.001939661, 0.006563001, -0.009757559, -0.00978824,
-0.001247868, 0.002622219, -0.009097288, -0.014394158, -0.00292424,
0.002644891, -0.005572549, -0.003181826, 0.002676673, 0.007032888,
0.002127581, 0.005281961, 0.016021024, 0.001232531, 0.005515082,
0.000450254, 0.003568462, 0.006277841, -0.003823264, -0.032527132,
0.021873831, -0.003231721, -0.000368515, -0.001397511, -0.010973353,
-0.011563657, -0.010061858, 0.005714484, 0.007472816, 0.003407539,
-0.000612977, -0.000800283, -0.001900635, -0.000865432, -0.003630001,
0.00562073, 0.001858425, 0.010064273, -0.006584881, -0.001470899,
0.005433816, -0.002510864, -0.001071656, -0.005130965, 2.35065e-05,
0.003445676, 0.01374472, -0.001123534, 0.006067276, 0.004050843,
-0.000773321, -0.003401186, 0.001908336, -0.003562041, -0.001180884,
-0.003133416, 0.005819655, -0.002096198, -4.92007e-05, 0.002838133,
-0.010010669, 0.00557654, -0.000122526, 0.022760252, -0.005618111,
0.014434193, 0.001716112, 0.01567573, 0.001566116, -0.003071945,
-0.018146189, -0.012123038, -0.007480614, 0.007735601, -0.00436506,
0.003091618, 0.004704796, 0.001184206, 0.010066361, 0.005389096,
-0.007021784, -0.004211278, -0.001740557, -0.00628043, 0.002434464,
-0.000333944, 0.010815674, 0.016910153, 0, -0.01318228, -0.002858256,
0.024721185, 0.001006412, -0.003651077, 0.009682259, -0.007093437,
-0.002005597, 0.002424598, -0.015024047, 0.015051995, 0.004720944
), na.action = structure(504L, class = "omit"))
Your version is not working because result is local to the function's body and it is lost as you exit the function. I suspect you have another result object in your global environment (a vector of zeroes) and that's what you always get when you try to check your result.
Instead, make your function explicitly return result by adding a return statement at the end:
niv_density <- function(returns, mu, delta, alpha, beta, n) {
t <- 1/n
gamma <- sqrt(alpha^2 - beta^2)
result <- rep(0, n)
for(i in seq_len(n)) {
term3 <- exp(delta*gamma*t + beta*(returns[i] - mu*t))
term1 <- alpha*delta*t/pi
term2_1 <- besselY(alpha*sqrt(delta^2*t^2 + (returns[i] - mu*t)^2), 1)
term2_2 <- sqrt(delta^2*t^2 + (returns[i] - mu*t)^2)
term2 <- term2_1/term2_2
result[i] <- (term1*term2*term3)
}
return(result)
}
And when calling the function, assign the result as follows:
result <- niv_density(returns, 0, 2, 50, 0, 10)
(and maybe you should avoid calling a variable result, I'm sure you can find a more descriptive name from the context.)

Resources