Fonction au sein de la Fonction dans la R
Pouvez-vous s'il vous plaît expliquez-moi pourquoi le code se plaint en disant que Samdat
n'est pas trouvé?
Je suis en train de basculer entre les modèles, donc j'ai déclaré une fonction qui contient ces modèles et j'ai juste besoin d'appeler cette fonction comme l'un de l'argument dans la get.f
fonction où le rééchantillonnage va changer la structure de chaque matrice de conception dans le modèle. Le code se plaint que Samdat
n'est pas trouvé, quand il est trouvé.
Aussi, est-il un moyen pour moi de faire l'instruction conditionnelle if(Model == M1())
au lieu de devoir créer un autre argument M
pour définir if(M==1)
?
Voici mon code:
dat <- cbind(Y=rnorm(20),rnorm(20),runif(20),rexp(20),rnorm(20),runif(20), rexp(20),rnorm(20),runif(20),rexp(20))
nam <- paste("v",1:9,sep="")
colnames(dat) <- c("Y",nam)
M1 <- function(){
a1 = cbind(Samdat[,c(2:5,7,9)])
b1 = cbind(Samdat[,c(2:4,6,8,7)])
c1 = b1+a1
list(a1=a1,b1=b1,c1=c1)}
M2 <- function(){
a1= cbind(Samdat[,c(2:5,7,9)])+2
b1= cbind(Samdat[,c(2:4,6,8,7)])+2
c1 = a1+b1
list(a1=a1,b1=b1,c1=c1)}
M3 <- function(){
a1= cbind(Samdat[,c(2:5,7,9)])+8
b1= cbind(Samdat[,c(2:4,6,8,7)])+8
c1 = a1+b1
list(a1=a1,b1=b1,c1=c1)}
#################################################################
get.f <- function(asim,Model,M){
sse <-c()
for(i in 1:asim){
set.seed(i)
Samdat <- dat[sample(1:nrow(dat),nrow(dat),replace=T),]
Y <- Samdat[,1]
if(M==1){
a2 <- Model$a1
b2 <- Model$b1
c2 <- Model$c1
s<- a2+b2+c2
fit <- lm(Y~s)
cof <- sum(summary(fit)$coef[,1])
coff <-Model$cof
sse <-c(sse,coff)
}
else if(M==2){
a2 <- Model$a1
b2 <- Model$b1
c2 <- Model$c1
s<- c2+12
fit <- lm(Y~s)
cof <- sum(summary(fit)$coef[,1])
coff <-Model$cof
sse <-c(sse,coff)
}
else {
a2 <- Model$a1
b2 <- Model$b1
c2 <- Model$c1
s<- c2+a2
fit <- lm(Y~s)
cof <- sum(summary(fit)$coef[,1])
coff <- Model$cof
sse <-c(sse,coff)
}
}
return(sse)
}
get.f(10,Model=M1(),M=1)
get.f(10,Model=M2(),M=2)
get.f(10,Model=M3(),M=3)
Pourriez vous s'il vous plaît reindent votre code pour voir où les fonctions de début et de fin? Peut-être que ce sera également vous aider à résoudre votre problème.
Je les ai séparés par une ligne de l'espace, qu'entendez-vous par reindent
Ce que je voulais dire, c'est exactement ce que Jilber fait pour vous.
Ce n'est pas moi qui a fait l'indentation, c'était @themel, les crédits d'aller pour lui. 🙂
Je les ai séparés par une ligne de l'espace, qu'entendez-vous par reindent
Ce que je voulais dire, c'est exactement ce que Jilber fait pour vous.
Ce n'est pas moi qui a fait l'indentation, c'était @themel, les crédits d'aller pour lui. 🙂
OriginalL'auteur Falcon-StatGuy | 2012-09-01
Vous devez vous connecter pour publier un commentaire.
Lorsque vous appelez
votre
M1
fonction est immédiatement appelée. Il meurt parce que à l'intérieur du corps deM1
vous utilisezSamdat
qui n'est définie que plus tard, dans le corps deget.f
.En quelque sorte, vous devez appeler
M1
aprèsSamdat
est défini. Une façon de le faire est de faireM1
(la fonction) d'un argument àget.f
et d'appeler la fonction à partir de l'intérieur deget.f
:Aussi, en général, c'est mauvais de programmation à utiliser des variables globales, c'est à dire, faire de votre fonction de l'utilisation des variables qui sont définies à l'extérieur de leur champ d'application. Au lieu de cela, il est recommandé que tout une fonction utilise être passés comme arguments d'entrée. Vous avez deux cas de ce type dans votre code:
M1
(M2
, etM3
) utilisationSamdat
etget.f
utilisedat
. Ils devraient être des arguments à vos fonctions. Voici une belle version de votre code. Je n'ai pas tout fixé, de sorte que vous aurez à faire un peu plus pour le faire fonctionner:Une dernière chose qui saute: si la définition de
s
(ce que j'ai recueillis en vertu de l'switch()
est liée à laModel
que vous utilisez, puis envisager de fusionner les définitions deModel
ets
ensemble: ajouters
à la liste de sortie de votreM1
,M2
,M3
les fonctions de sorte ques
peut être simplement définie commes <- Model$s
, et vous pouvez ensuite déposer leM
d'entrée àget.f
.OriginalL'auteur flodel
Vous pouvez avoir un coup d'oeil à la R règles de portée. En particulier, il n'y a pas de raison de s'attendre à ce que les variables que vous définissez dans une fonction sont visibles dans d'autres fonctions.
Vous pourrait être confondue en raison de l'environnement mondial (c'est à dire le haut-niveau à l'extérieur de toutes les fonctions) est une exception à cette règle. Je ne vais pas dans vos questions, mais permettez-moi de noter que la totalité du script semble très foiré pour moi - c'est à dire
M1
àM3
sont essentiellement une fonction, et la liasse de le copier/coller dansget.f
est certainement terrible. Tout ce que vous essayez de faire, peut certainement être écrit dans un moins alambiqué.Jetons un coup d'oeil à la
M
s de première pourquoi pas une fonction avec un paramètre? Y compris la solution à votre portée de problème, cela fait deux paramètres -Si vous insistez sur la définition d'alias, vous pouvez aussi faire quelque chose comme
C'est déjà moins répétitif, mais, idéalement, vous voulez que l'ordinateur pour faire de la répétition pour vous (SEC!):
Regardant
get.f
, c'est pas très clair ce que vous êtes en train de faire - vous êtes à essayer de monter quelque chose et de recueillir quelque chose à partir des résultats, mais la partie surModel$cof
fait référence à une variable non définie (votreModel
juste aa1
,b1
etc1
entrées). En supposant que vous souhaitez collectercof
et en supprimant les intermédiaires de code,get.f
ressemble probablement à ceci:C'est encore terriblement répétitive, alors pourquoi ne pas penser à ce sujet pendant une minute? Tout ce que vous faites avec vos échantillons est de calculer une colonne à utiliser dans votre ajustement. Je ne vois pas pourquoi vous avez besoin de faire le calcul dans un
M
fonction et ensuite faire l'extraction de la valeur unique dansget.f
(en fonction notamment de M vous utilisez) - ce qui semble indiquer que l'extraction devrait bien plutôt être une partie de la M... mais si vous avez besoin de les garder séparés, d'accord, nous allons utiliser des fonctions d'extraction. Vient toujours en vertu de la moitié de votre code de taille raisonnable écrit R:J'ai développé ma réponse.
J'ai apprécié le récit, +1.
Salut @themel, j'ai créé 3 scripts dans r. Le 1er est pour l'échantillonnage des données et crée différentes matrices pour l'échantillon de données. Puis dans la 2ème script que j'ai créé le modèle des fonctions (M1-M3) qui compined différentes matrices et de vérifier certains résultats. La 3ème script que j'ai créé l'obtenir.f pour s'adapter à différents modèles sur la base de ces différentes matrices dans la 2ème script. Mon objectif principal est d'obtenir de l'ESS résultats. J'ai environ 3000 colonnes
OriginalL'auteur themel