Hola,
Estoy aprendiendo a usar el programa R y me ha surgido un problema. Quiero resolver una serie de fórmulas donde hay constantes y variables. Yo se resolver la fórmula fácilmente con el programa, el problema me surge cuando quiero cambiar el valor de las variables sin tener que reescribir toda la fórmula. Además, son varias fórmulas donde el resultado de unas sirve para resolver otras. Es decir, quiero saber si es posible hacer servir el programa de una manera similar que con el excel, que cambiando un valor, directamente se cambian los resultados de todas las formulas relacionadas con ese valor.
¿Alguien sabe cómo hacerlo?
¡Muchísimas gracias!
Mientras tanto... Cuando vos creas una funcion... Por ejemplo esta...
sumar2<- function( dato1)
sumar2(4)
Entonces al "4" le va a sumar "2" y te va a mostrar el resultado: 6.
No tendrías que tener problema en poner otro dato1, y que te de el resultado.
Si tengo estas fórmulas:
FORMULA !: x = y + z*k
("y" y "z" son variables i "k" es constante)
· Esta primera fórmula, con lo que me has explicado ya se como hacerlo. El problema es cuando luego tengo:
FORMULA 2: m = n - x
(en este caso, la "n" es una variable y la "x" es el resultado de la anterior fórmula. Se puede hacer que esta fórmula coja el valor de "x" de la anterior fórmula? Y cuando vaya cambiando las variables "y" y "z" también me vaya cambiando el resultado de "m" directamente?
He puesto este ejemplo simplificado, ya que realmente las fórmulas que utilizo son un poco más complejas, pero yo creo que si entiendo esto ya podré hacer las fórmulas reales sin problemas.
Muchas gracias!
Eso quiero ver... ¿Tenés un script hecho o no?
FORMULA !: x = y + z*k
("y" y "z" son variables i "k" es constante)
#####################################
ECUACION<- function(y,z,k)
return(x)
{
return(x)
ECUACION2(c(2,5),3,4)
Da como resultado 14 y 25.
Si te fijas... el primer valor es un vector... c(2,5)... que son dos valores de Y, para que haga con cada uno de ellos el cálculo con tu fórmula.
#######################
· S = 20*(1+kdt*SRT)/(SRT*(umt-kdt)-1)
donde las variables son: kdt=0.08, SRT=12.71, umt=3.49
y el resultado es S= 0.9526441
· Pxbh = Q*0.4*(bCOD-S)/(1+kdt*SRT)
donde las variables son: Q=22464, bCOD=224, S= 0.9526441(resultado anterior), kdt=0.08, SRT=12.71/p>
· Pxdead = 0.15*kdt*Q*0.4*(bCOD-S)*SRT/(1+kdt*SRT)
donde las variables son: kdt=0.08, Q=22464, bCOD=224, S=0.9526441, SRT=12.71
· Pxbio1=Pxbh+Pxdead+Pxbnit1
donde Pxbh y Pxdead son el resultado de las anteriores equaciones
Y así succesivamente...
Lo que quiero es saber si puedo hacer que el programa coja directamente los resultados de las equaciones para las próximas equaciones sin que yo tenga que ponerle el valor.
Gracias!
Hola,
Estoy aprendiendo a usar el programa R y me ha surgido un problema. Quiero resolver una serie de fórmulas donde hay constantes y variables. Yo se resolver la fórmula fácilmente con el programa, el problema me surge cuando quiero cambiar el valor de las variables sin tener que reescribir toda la fórmula.
Para no tener que escribir toda la fórmula, vas a tener que escribir las ecuaciones que vos tenés como funciones, como los ejemplos que te di. No hay otra forma. Te combiene también, ya que de esa forma podés poner varios números para que calcule el resultado.
Además, son varias fórmulas donde el resultado de unas sirve para resolver otras. Es decir, quiero saber si es posible hacer servir el programa de una manera similar que con el excel, que cambiando un valor, directamente se cambian los resultados de todas las formulas relacionadas con ese valor.
Esto lo podés hacer agregando dentro de la función un parte que utilice la función "save" y la funcion "load". De esta forma, cada función va a guardar los resultados que haga, y la siguiente función los cargará como dato.
vamos con un ejemplo de una de tus funciones
("y" y "z" son variables i "k" es constante)
####### COMIENZO FORMULA 1##############################
ECUACION1<- function(y,z,k)
return(x) # Me muestra el objeto x.
######################## FIN FUNCION 1 ###########################
COMENTARIO TUYO SOBRE LA SEGUNDA ECUACION
FORMULA 2: m = n - x
(en este caso, la "n" es una variable y la "x" es el resultado de la anterior fórmula. Se puede hacer que esta fórmula coja el valor de "x" de la anterior fórmula? Y cuando vaya cambiando las variables "y" y "z" también me vaya cambiando el resultado de "m" directamente?
Con esta ideas, entonces armamos la segunda ecuacion, donde vamos a agregar un "load" para que cargue los valores de "x" que ya están guardados, así no los tenés que cargar.
##################### INICIO FURMULA 2###########################
ECUACION2<- function (m,n,x)
{
cantidad2<- length(x)
n<- c(1:cantidad2)
for (h in 1:cantidad2)
{
m[h]<- n[h] - x[h]
}
save(m, file="m.RData")
return(m)
}
################ FIN FUNCION 2 #############################
Una vez que tengas cargadas las funciones, las usas sin problema.
> ECUACION1( c(2, 4), 3, 4)
[1] 14 16
> ECUACION2(c(3,2), c(2,5), x)
[1] -13 -14
Ya que estamos, por las dudas hago una explicación más...
ECUACION1(y,k,z)
ECUACION1(c(2, 4), 3, 4)
En este caso, y es un vector que tiene 2 numeros, el 2 y el 4, entonces, la ECUACION1 va a resolver para 2, y después para 4.
El valor de k es 3, y el valor de z es 4.
ECUACION(m,n,x)
ECUACION2(c(3,2), c(2,5), x)
En este caso, m vale 3 para el primer valor de x, y 2 para el segundo valor de x.
Acá vas a tener que tener cuidado en recordar cuantos valores de x usaste antes.
Últimas cosas para decirte....
1) Como usamos las funciones "save", vos podés usar "load" fuera de la funcion y el objeto se carga. Por ejemplo, si usaste la primer funcion, le hiciste save a los valores de "x", y te olvidaste que valores usaste o cuantos eran. Entonces... hacés...
load("x.RData)
Y el objeto "x" ya está disponible para que lo llames haciendo:
> x
2) Si vos querés encadenar más funciones.... toda función debe comenzar con "load" y terminar con "save". Excepto la primera (que no tendra "load", por que es la primera)... y depende de vos la última (si te interesa o no guardar los cálculos de la última función podrá tener o no un "save", pero si o si un "load" al comienzo.
3) Debés tener cuidado... por ejemplo en la función 2.... Por cada valor de "x" debés ingresar un valor de "m" y "n" por más que sea el mismo valor, por que la función (como yo te la hice) va a ir a buscar si o si un valor de "m" y "n".
Entonces... por ejemplo, que tenés 3 valores de "x" que ya calculaste que con la primer funcion... y para la segunda función querés esos valores de "x" pero con un solo valor de "m" y "n"... entonces, vas a tener que ponerlo así:
ECUACION2(m,n,x)
ECUACION2(c(3,3,3), c(5,5,5), x)
En cambio la primer función no tiene ese problema por que vos de entrada dijiste que van a ser constantes, entonces en el bucle for las constantes no tienen subindice.
Bueno... espero se entienda. Tratá de ser lo más explícito posible.
Nos vemos.
David Elías
Y después, por cualquier cosa... todos los archivos a los que les des "save" o "load" van entre comillas. Si falta alguna, agregala.
Sí que es verdad que faltaba definir la variable Pxbnit1, pero para ello había unas cuantas fórmulas más por el medio y he pensado que con lo que había puesto ya se entendía y no hacía falta ponerlas todas.
Muchísimas gracias de nuevo! Me habéis ayudado un montón!
Ya tengo escritas todas las fórmulas y los resultados me dan lo que toca. La función es esta:
resultats <- function(bCODBOD, BOD, VSS, COD, sBOD, sCOD, TSS, TKNpa, T, NH3Ne, DO, Q, TKN, MLSS, NO3Ne, RAS, tanoxic1, tanoxic2, rbCOD, SDNR1, SDNR2, tdanoxic, tanaerobic, IRp, P) {
bCOD <- bCODBOD*BOD
nbCOD <- COD-bCOD
nbVSS <- VSS*(1-((bCODBOD)*(BOD-sBOD)/(COD-sCOD)))
iTSS <- TSS-VSS
SF <- TKNpa
knt <- kn*kn0^(T-20)
kdnt <- kdn*kdn0^(T-20)
unmt <- unm*unm0^(T-20)
un <- (unmt*NH3Ne)/(knt+NH3Ne)*(DO/(ko+DO))-kdnt
kst <- ks*ks0^(T-20)
kdt <- kd*kd0^(T-20)
umt <- um*um0^(T-20)
SRTtheo <- 1/un
SRT <- SRTtheo*SF
S <- kst*(1+kdt*SRT)/(SRT*(umt-kdt)-1)
Pxbh <- Q*Y*(bCOD-S)/(1+kdt*SRT)
Pxdead <- fd*kdt*Q*Y*(bCOD-S)*SRT/(1+kdt*SRT)
Nox1 <- 0.8*TKN
Pxbnit1 <- Q*Yn*Nox1/(1+kdnt*SRT)
Pxbio1 <- Pxbh+Pxdead+Pxbnit1
Nox2 <- TKN-NH3Ne-0.12*Pxbio1/Q
Pxbnit2 <- Q*Yn*Nox2/(1+kdnt*SRT)
Pxbio2 <- Pxbh+Pxdead+Pxbnit2
Nox3 <- TKN-NH3Ne-0.12*Pxbio2/Q
Pxbnit3<- Q*Yn*Nox3/(1+kdnt*SRT)
Pxbio3 <- Pxbh+Pxdead+Pxbnit3
Pxvss <- Pxbio3+Q*nbVSS
Pxtss <- Pxbio3/0.88+Q*nbVSS+Q*(TSS-VSS)
MassMLVSS <- Pxvss*SRT
MassMLSS <- Pxtss*SRT
Vaerobic <- MassMLSS/MLSS
taerobic <- Vaerobic/Q
thaerobic <- taerobic*24
VSSfraction <- MassMLVSS/MassMLSS
MLVSS <- MLSS*VSSfraction
observedyield <- Pxtss/(Q*(bCOD-S))*bCODBOD
Xb <- SRT*Q/Vaerobic*(Y*bCOD/(1+kdt*SRT))
IR <- Nox3/NO3Ne-1-RAS
Noxfeed <- (IR*Q+RAS*Q)*NO3Ne
Vanoxic1 <- tanoxic1*Q
Vanoxic2 <- tanoxic2*Q
FMb1 <- Q*BOD/(Vanoxic1*Xb)
FMb2 <- Q*BOD/(Vanoxic2*Xb)
rbCODbCOD <- rbCOD/bCOD
SDNRt1 <- SDNR1*1.026^(T-20)
SDNRt2 <- SDNR2*1.026^(T-20)
NOr1 <- Vanoxic1*SDNRt1*Xb
NOr2 <- Vanoxic2*SDNRt2*Xb
Excesscap1 <- NOr1/Noxfeed
Excesscap2 <- NOr2/Noxfeed
Vanoxic <- tdanoxic*Q
Vanaerobic <- tanaerobic*Q
NO3reac <- NO3Ne*IRp/(1+IRp)
rbCODremov <- NO3reac*rbCODrem
rbCODava <- rbCOD-rbCODremov
biorem <- rbCODava/rbCODreq
Pbiomassg <- (Pxbh+Pxbnit3)*Pbac/Q
Premov <- Pbiomassg+biorem
Peff <- P-Premov
res <- c(bCOD, nbCOD, nbVSS, iTSS, SF, knt, kdnt, unmt, un, kst, kdt, umt, SRTtheo, SRT, S, Pxbh, Pxdead, Nox1, Pxbnit1, Pxbio1, Nox2, Pxbnit2, Pxbio2, Nox3, Pxbnit3, Pxbio3 , Pxvss, Pxtss, MassMLVSS, MassMLSS, Vaerobic, taerobic, thaerobic, VSSfraction, MLVSS, observedyield, Xb, IR, Noxfeed, Vanoxic1, Vanoxic2, FMb1, FMb2, rbCODbCOD, SDNRt1, SDNRt2, NOr1, NOr2, Excesscap1, Excesscap2, Vanoxic, Vanaerobic, NO3reac, rbCODremov, rbCODava, biorem, Pbiomassg, Premov, Peff)
names(res) <- c("bCOD", "nbCOD", "nbVSS", "iTSS", "SF", "knt", "kdnt", "unmt", "un", "kst", "kdt", "umt", "SRTtheo", "SRT", "S", "Pxbh", "Pxdead", "Nox1"," Pxbnit1", "Pxbio1", "Nox2", "Pxbnit2", "Pxbio2", "Nox3", "Pxbnit3", "Pxbio3" , "Pxvss", "Pxtss", "MassMLVSS", "MassMLSS", "Vaerobic", "taerobic", "thaerobic", "VSSfraction", "MLVSS", "observedyield", "Xb", "IR", "Noxfeed", "Vanoxic1", "Vanoxic2", "FMb1", "FMb2", "rbCODbCOD", "SDNRt1", "SDNRt2", "NOr1", "NOr2", "Excesscap1", "Excesscap2", "Vanoxic", "Vanaerobic", "NO3reac", "rbCODremov", "rbCODava", "biorem", "Pbiomassg", "Premov", "Peff")
return(res) }
Donde por ejemplo, los valores de las variables podrían ser estas:
resultats(1.6, 140, 60, 300, 70, 132, 70, 1.5, 12, 0.5, 2, 22464, 35, 3000, 6, 0.6, 0.104, 0.0625, 80, 0.22, 0.31, 0.0625, 0.0625, 2, 6)
(las constantes (kn, kdn, unm...) las tengo guardadas en el programa)
Lo que quiero preguntaros es a ver si es posible coger el valor de las variables, por ejemplo, de una data.frame. Es decir, si yo tuviera algo así:
Variable |
Valor |
Q |
22464 |
T |
12 |
BOD |
140 |
... |
... |
Y para llamar la función indicarle dónde ir a buscar cada valor de la variable en la tabla. De esta manera, en el momento de cambiar el valor de las variables sería más fácil.
No sé si me he explicado bien...
Gracias!