2017-09-02 3 views
0

ループで使用すると、Rで作成した関数の出力を返す際に問題が発生しています。私は出力形式の複数のMCMCモデルを1つのRオブジェクトに結合しようとしています。Rはループを使用して関数から出力を返す

機能:私は機能を介して実行するRDATA MCMC出力のリストを作成するために使用

get_scrUN_output <- function(filename){ 
    out <- filename 
    nam<-c("sigma","lam0","psi", "N") 
    nam<-match(nam,dimnames(out[[1]]$sims)[[2]]) 

    out.lst<-mcmc.list(
     as.mcmc(out[[1]]$sims[200001:300000,nam]), 
     as.mcmc(out[[2]]$sims[200001:300000,nam]), 
     as.mcmc(out[[3]]$sims[200001:300000,nam])) 

    s <- summary(out.lst) 
    gd <- gelman.diag(out.lst,multivariate = FALSE) 

    output_table <- rbind(as.data.frame(t(s$statistics)), 
        as.data.frame(t(s$quantiles)), 
        as.data.frame(t(gd$psrf))) 
    return(output_table) } 

コード:

scrUN.ET <- list.files(getwd(),"out.*ET.RData") 
    scrUN.lst <- as.vector(substring(scrUN.ET,1)) 
    scrUN.lst <- str_sub(scrUN.lst, 1, str_length(scrUN.lst)-3) 

    >scrUN.lst 
    [1] "BBout11FL" "BBout11TL" "BBout12TL" "BBout13FL" "BBout13TL" 

私は、個々の出力ファイルに関数を使用して、それは動作します:

get_scrUN_output(BBout11FL) 

    sigma  lam0   psi   N 
    Mean   130.43594323 14.5319368 0.3361405211 335.8042733 
    SD    7.28386725 9.7311139 0.2743725813 274.6828277 
    Naive SE   0.01329846 0.0177665 0.0005009335 0.5014999 
    Time-series SE 1.28032869 1.3886577 0.0360607870 36.5692414 
    2.5%   118.37718370 0.6129902 0.0300165600 30.0000000 
    25%   124.29743884 5.7535456 0.0958156210 95.0000000 
    50%   130.40628214 15.1264454 0.2426328827 242.0000000 
    75%   135.99836262 19.9685209 0.5403864215 541.0000000 
    97.5%   145.11615201 34.9438198 0.9298185748 930.0000000 
    Point est.  1.59559993 4.4590599 1.0677998255 1.0678381 
    Upper C.I.  2.56854388 9.5792520 1.2186078069 1.2186933 

私はループを使用して関数を介してすべての出力ファイルを実行しようとするとNULL出力

scrUN.output <- rbind(
     for (i in seq_along(scrUN.lst)){ 
     get_scrUN_output(get(scrUN.lst[i])) 
     } 
    ) 


    >scrUN.output 
    NULL 

ありがとう!

答えて

0

私はこれがあなたが求めていると思います。これは最終的なコードセクションの編集です。 forループによって何も返されていないので、あなたは何のためにもrbindを使用していました。

scrUN.output <- lapply(scrUN.lst, function(i) get_scrUN_output(get(i))) 
scrUN.output <- do.call(rbind, scrUN.output) 
scrUN.output 
+0

作品を完璧に!ありがとうございました。 – JoB

1

あなたは何を-ingないrbindよさの理由。

ここでは、上記のコードが行っていることを示す簡単な例があります。forループは、最後にNULLを得ている変数に何も割り当てていません。

xx <- rbind( 
    for(i in c(1,2)){ 
     i 
    } 
) 
print(xx) # NULL 

代わりにこれを試してみてください:

scrUN.output <- list() # initialize a list 
for (i in seq_along(scrUN.lst)){ 
    # update the list contents 
    scrUN.output[[i]] <- get_scrUN_output(get(scrUN.lst[i])) 
} 
# finally, rbind eveything 
scrUN.output <- do.call(rbind, scrUN.output) 

またはをいっそ、使用lapply

scrUN.output <- lapply(scrUN.lst, get_scrUN_output) 
scrUN.output <- do.call(rbind, scrUN.output) 
関連する問題