2015-08-14 118 views
0

我不得不承認我是編程功能的新手,所以我需要你的幫助。鏈接兩個函數

該代碼應在ANOVA之後提供貝葉斯準則(pBIC),並自動從ANOVA表中讀取必要的信息。

我有兩個功能

## This is function 1 

test_pBIC1 <- function(name,c){ ## name is the name of the ANOVA table, e.g. "ANOVA_ALL_wake" and c is the number of conditions 
    c = c 
    data = get(name) 
    i = length(data$ANOVA$Effect) 
    result1 = data.frame(name,c,i) 
    return(result1) 
} 
## ---------------------------------------------------- 
## I now run and save the result of Function 1 

result1 <- test_pBIC1("ANOVA_ALL_wake",3) ## for test 

## ---------------------------------------------------- 
## This is function 2 

test_pBIC2 <- function(result1){ 
    name1 <- as.character(result1$name) 
    data = get(name1) 
    count <- as.vector(result1$i) 
    for (i in 1:count){ 
    s = (data$ANOVA$DFd[i]/data$ANOVA$DFn[i])+1 
    n = s*(result1[2]-1) 
    SSE1 = data$ANOVA$SSd[i] 
    SSE0 = data$ANOVA$SSd[i]+data$ANOVA$SSn[i] 
    deltaBIC = (n * log(SSE1/SSE0))+(data$ANOVA$DFn[i]*log(n)) 
    BF01 = exp(deltaBIC/2) 
    pH0_D = (BF01/(1+BF01)) 
    pH1_D = (1-pH0_D) 
    result = data.frame(pH0_D, pH1_D) 
    colnames(result) <- c("pH0_D", "pH1_D") 
    rownames(result) <- c(data$ANOVA$Effect[i]) 
    if (i == 1){ 
     result_all <- result 
    } else { 
     result_all <- rbind (result_all, result) 
    } 
    } 
    return(result_all) 
} 
## ------------------------------------------------------ 
Now I run function 2 and receive the result 

test_pBIC2(result1) 

現在,雖然這確實是工作,我想這兩個功能相聯繫,所以我只要給的名稱和參數c,仍然最終獲得result_all,即不必在彼此之後運行這兩個功能。

我試圖想出了這個解決方案:

test_pBIC <- function(name,c){ ## pass arguments as: test_pBIC(name = "ANOVA_all_wake", c = 3) 
    c = c 
    name = name 
    result1 = data.frame(name,c) 
    # return(result1) 

    test_pBIC1 <- function(result1){ 
    c = as.vector(result1$c) 
    name1 <- as.character(result1$name) 
    data = get(name) 
    i = length(data$ANOVA$Effect) 
    result2 = data.frame(name,c,i) 
    # return(result2) 

    test_pBIC2 <- function(result2){ 
     name1 <- as.character(result2$name) 
     data = get(name1) 
     count <- as.numeric(integer$i) 

     for (i in 1:count){ 
     s = (data$ANOVA$DFd[i]/data$ANOVA$DFn[i])+1 
     n = s*(result1[2]-1) 
     SSE1 = data$ANOVA$SSd[i] 
     SSE0 = data$ANOVA$SSd[i]+data$ANOVA$SSn[i] 
     deltaBIC = (n * log(SSE1/SSE0))+(data$ANOVA$DFn[i]*log(n)) 
     BF01 = exp(deltaBIC/2) 
     pH0_D = (BF01/(1+BF01)) 
     pH1_D = (1-pH0_D) 
     result = data.frame(pH0_D, pH1_D) 
     colnames(result) <- c("pH0_D", "pH1_D") 
     rownames(result) <- c(data$ANOVA$Effect[i]) 
     if (i == 1){ 
      result_all <- result 
     } else { 
      result_all <- rbind (result_all, result) 
     } 
     } 
     return(result_all) 
    } 
    } 
} 


test_pBIC("ANOVA_all_wake", 3) 

不過,我只是得到什麼......我不能發現其中的錯誤:(

謝謝!

+0

你是否已經通過實例輸入一步一步執行了更大的過程,並看到它失敗的地方? – ulfelder

回答

1

不完全確定是什麼問題,一個可重複的例子會幫助很多。如果你想把它合併成一個功能,你可以做...

test_overall <- function(name,c) { 
    c = c 
    data = get(name) 
    i = length(data$ANOVA$Effect) 
    result1 = data.frame(name,c,i) 
    name1 <- as.character(result1$name) 
    data = get(name1) 
    count <- as.vector(result1$i) 
    for (i in 1:count){ 
    s = (data$ANOVA$DFd[i]/data$ANOVA$DFn[i])+1 
    n = s*(result1[2]-1) 
    SSE1 = data$ANOVA$SSd[i] 
    SSE0 = data$ANOVA$SSd[i]+data$ANOVA$SSn[i] 
    deltaBIC = (n * log(SSE1/SSE0))+(data$ANOVA$DFn[i]*log(n)) 
    BF01 = exp(deltaBIC/2) 
    pH0_D = (BF01/(1+BF01)) 
    pH1_D = (1-pH0_D) 
    result = data.frame(pH0_D, pH1_D) 
    colnames(result) <- c("pH0_D", "pH1_D") 
    rownames(result) <- c(data$ANOVA$Effect[i]) 
    if (i == 1){ 
     result_all <- result 
    } else { 
     result_all <- rbind (result_all, result) 
    } 
    } 
    return(result_all) 
} 
0

。在第一個代碼示例中,您創建了函數test_pBIC1test_pBIC2。如果要創建調用兩者的函數test_pBIC,則只需定義一個函數即可調用:

test_pBIC <- function(name, c) test_pBIC2(test_pBIC1(name, c))