2013-11-28 45 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") 
相关问题