【发布时间】:2013-12-15 00:20:11
【问题描述】:
我是 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* 澄清一下,我对将子集名称和表达式传递给函数的其他方法持开放态度,而不是作为参数。我只是希望能够在不同的子集上多次重复分析/代码,并相应地命名输出。感谢您的见解!
【问题讨论】:
-
我对 xtabs 和 kw 函数不太熟悉,但我认为您的 SUBEXP 表达式必须是一个字符。 'Year == 2013' 并不完全是您可以传递给您的函数的参数(我不认为)。您可能必须将其作为字符串传递,然后使用
eval(parse(text = SUBEXP))。如果我误解了您的问题,我深表歉意。 -
我怀疑你会得到任何答案,除非你向人们展示你的输入数据并给他们
dput()。问问自己是否有人向您展示了您发布的功能 - 您能否在不查看数据的情况下对其进行解密? -
只是为了让您朝着正确的方向前进,当您在函数(或其他地方)中传递
Year == 2013或Observer == "JMDR"之类的东西时,您实际上传递的是一个逻辑向量,其值为 "变量 Year 的每个值是否等于 2013”。您可能打算使用函数quote或expression,但它变得非常坚韧。还有其他方法可以完成相同的任务,但您的目标是什么并不完全清楚。 -
您可以改用
VVD$Year == 2013使其工作,但这不是一个很好的解决方案。这里真正的问题是您在函数中硬编码了太多东西。而不是硬编码data = VVD,只需跳过子集参数并将所需数据的子集传递给您的函数。这要简单得多。