2017-02-21 68 views
0

我有我的程序遇到的問題的一個小的可重現版本。通過R中的嵌套函數更新數據框

我的代碼的結構涉及嵌套函數,類似於下面顯示的函數,只是更復雜。

x <- data.frame(c(1:5),c(0)) 
colnames(x) <- c("val1", "val2") 

foo <- function() { 
    for(i in 1:length(x[,1])) { 
    bar(i) 
    } 
    print(x) 
} 

bar <- function(i) { 
    if(x[i,2] == 0) { 
    x[i,2] <- 1 
    print(x[i,]) 
    } 
    return(x) 
} 

>foo() 
    val1 val2 
1 1 1 
    val1 val2 
2 2 1 
    val1 val2 
3 3 1 
    val1 val2 
4 4 1 
    val1 val2 
5 5 1 
    val1 val2 
1 1 0 
2 2 0 
3 3 0 
4 4 0 
5 5 0 

因此,結果顯示,該值不是從bar()函數返回以更新數據幀。

爲了將更新的表格返回給foo()函數,需要更改哪些內容?

在此先感謝。

+0

你能簡單地解釋一下你想從你的函數中得到什麼輸出嗎?我想我有一個答案,但我不太確定我知道你想要什麼作爲解決方案。 – SeldomSeenSlim

+0

感謝您的回覆,我正在尋找一個更新的數據框x,其中第二列的所有值都將爲1. – user7200033

+0

而在更復雜的示例中,我希望您希望有條件地更改第二列? – SeldomSeenSlim

回答

1

最好將data.frame作爲參數,而不是硬編碼到函數中。這裏有一些修改應該做到你在找什麼

foo <- function(df) { 
    for(i in seq_len(nrow(df))) { 
    df[i, ] <- bar(df[i, ]) 
    } 
    print(df) 
} 

bar <- function(df) { 
    if(df[, "val2"] == 0) { 
    df[, "val2"] <- 1 
    print(df[, ]) 
    } 
    return(df) 
} 

> foo(x) 
    val1 val2 
1 1 1 
    val1 val2 
2 2 1 
    val1 val2 
3 3 1 
    val1 val2 
4 4 1 
    val1 val2 
5 5 1 
    val1 val2 
1 1 1 
2 2 1 
3 3 1 
4 4 1 
5 5 1 
+0

非常好,謝謝。這正是我所尋找的,我對自己沒有找到解決辦法感到失望。我在說'df [i,] < - bar(df [i,])'是更新存儲的行嗎? – user7200033

+0

這是正確的。原函數在'bar'函數內修改'x',但是這個改變不是在調用環境'foo'中進行的。這裏有一些很好的信息:http://adv-r.had.co.nz/Environments.html – manotheshark

0

所以我有點困惑,爲什麼你需要寫一個函數來做到這一點。到目前爲止,最簡單的解決辦法只是有條件子集數據框,並指定值:

x <- data.frame(c(1:5),c(0)) 
    colnames(x) <- c("val1", "val2") 


    x$val2[x$val2==0]<-1 

但是,如果這是過於簡單化的答案,作爲解決方案需要擴展,我懷疑嵌入的一個應用功能可能會奏效。