我正在尝试创建一个函数,用于绘制整个数据集或数据子集的图形。该函数需要能够同时执行这两项操作,以便您可以根据需要绘制子集。我正在努力提出通用子集函数。
我目前有这个代码(我更像是SAS用户,所以R让我有点困惑):
subset<-function(dat, varname, val)
if(dat$varname==val) {
data<-subset(dat, dat$varname==val)
}
但是R不断返回此错误消息:
if(dat $ varname == val){:参数长度为零
时出错
有人可以帮我解决这个问题吗?非常感谢!我认为这可能与我写它的方式有关。
答案 0 :(得分:2)
首先关闭所有$运算符无法处理变量。在您的代码中,您始终在查找名为varname的列。
将$varname
替换为[varname]
。
下一个错误是你正在调整一个向量,dat$varname==val
将是一个布尔值的向量。
您的代码中的第三个错误是您正在命名您的函数子集,从而在基础包中覆盖子集函数。因此对子集的内部调用将是对您自己的函数的递归调用。要解决此问题,请重命名您的函数,或者您必须指定它是您使用base::subset(dat, dat[varname]==val)
调用的基本包中的子集函数。
代码中的最后一个错误是你的函数没有返回任何东西。不要将结果分配给变量数据,而是将其返回。
以下是代码的外观。
mySubset<-function(dat, varname, val)
if(any(dat[varname]==val)) {
subset(dat, dat[varname]==val)
} else {
NA
}
甚至更好
mySubset <- function(dat,varname,val) dat[dat[varname] == val]