2013-11-28 88 views
0

我是新來的R,所以請原諒(正確)我,如果我的語言是不準確的。R的變化與函數參數輸出對象名稱

我已經寫一個程序來裝載數據,創建一個列聯表(使用XTABS),在其上運行的一些外部的功能,並且輸出結果的表。我在我的完整數據集上運行了代碼,並且希望在我的數據的子集上運行相同的代碼。我包裹起來的代碼作爲一個功能,並希望能夠能夠通過名稱的子集(SUBNAM)和子表達(SUBEXP)在函數調用類似的論點:

HCACC <- function (SUBNAM, SUBEXP) { 
    CM.SUBNAM <- as.matrix(
     xtabs(~HC_map+HC_obs, data=VVD 
     , drop.unused.levels=FALSE, sparse=TRUE 
     , subset=(SUBEXP) 
    )) 

    AKw.SUBNAM <- kw(CM.SUBNAM, wtHC) 
    USER.SUBNAM <- as.data.frame(AKw.SUBNAM$user.wa) 
    write.csv(HCACC.SUBNAM, file="HCACC.SUBNAM.csv", row.names=TRUE) 
} 

HCACC(2013, Year == 2013) 
HCACC(JMDR, Observer == "JMDR") 

(最後三行是我想要的SUBNAM實例中,實際上有40個實例)

我想與CM.2013,CM.JMDR等來結束,而無需複製/粘貼&反覆查找/替換代碼。

似乎必須有一種方法來做到這一點,但我嘗試它的方式沒有奏效,而且我的谷歌搜索沒有改變任何事情(但我懷疑我可能一直在問錯誤的問題)。任何提示或指針,將不勝感激。

*EDIT*爲了澄清,我願意在比作爲參數的其他函數傳遞子集的名字和表達的其他方法。我只是希望能夠在不同的子集上多次重複分析/代碼並輸出相應的命令。感謝您的見解!

+0

我不太熟悉xtabs和kw函數,但我認爲你的SUBEXP表達式必須是一個字符。 'Year == 2013'並不完全是你可以傳遞給你的函數的一個參數(我不認爲)。您可能需要將它作爲字符串傳遞,然後使用'eval(parse(text = SUBEXP))'。如果我誤解了你的問題,我很抱歉。 –

+0

我懷疑你會得到任何答案,除非你向人們顯示你的輸入數據並給他們一個'dput()'。問問你自己,如果有人向你展示了你發佈的功能 - 你能否解讀它而不看數據? –

+0

爲了讓你朝着正確的方向前進,當你在一個函數(或其他地方)中傳遞類似'Year == 2013'或'Observer ==「JMDR」'的東西時,你實際傳遞的是一個邏輯向量,它的值是「變量Year的每個值是否等於2013」​​。你可能意思是使用函數'quote'或'expression',但它會變得非常堅韌。還有其他的方法可以完成同樣的任務,但是這並不完全清楚你的目標是什麼。 –

回答

0

首先,它看起來像有在你的代碼中的錯誤(錯誤)。您創建了數據框USER.SUBNAM,但嘗試寫出不存在的HCACC.SUBNAM。此外,你的意見說你想要你的文件名CM.2013和CM.JMDR,但你的代碼似乎在嘗試HCACC.2013和HCACC.JMDR。

它看起來像你確實需要使用SUBNAM是在輸出文件名的唯一地方。函數中的所有變量都是臨時變量,每次調用該函數時不需要使用不同的名稱。所以相反,我認爲你想要的東西是這樣的:

HCACC <- function (SUBNAM, SUBEXP) { 
     CM <- as.matrix(xtabs(~HC_map+HC_obs, data=VVD, 
     drop.unused.levels=FALSE, sparse=TRUE, 
     subset=(SUBEXP) 
     )) 

     AKw <- kw(CM, wtHC) 
     HCACC <- as.data.frame(AKw$user.wa) 
     write.csv(HCACC, file= paste("HCACC.", SUBNAM, ".csv", sep=""), 
     row.names=TRUE) 
    } 

    HCACC(2013, Year == 2013) 
    HCACC(JMDR, Observer == "JMDR") 
相關問題