我有一个模式列表
patternlist <- list('one' = paste(c('a','b','c'),collapse="|"), 'two' = paste(1:5,collapse="|"), 'three' = paste(c('k','l','m'),collapse="|"))
我想从中选择从数据框中提取行
dataframez <- data.frame('letters' = c('a','b','c'), 'numbers' = 1:3, 'otherletters' = c('k','l','m'))
使用此功能
pattern.record <- function(x, column="letters", value="one")
{
if (column %in% names(x))
{
result <- x[grep(patternlist$value, x$column, ignore.case=T),]
}
else
{
result <- NA
}
return(result)
}
奇怪的是,当我运行它时出错:
> pattern.record(dataframez)
Error in grep(patternlist$value, x$column, ignore.case = T) :
invalid 'pattern' argument
答案 0 :(得分:2)
问题是您使用`$`
运算符。
在你的函数中,它正在查找名为column
这里使用`[[`
然后x[[column]]
使用column
定义的内容,而不是column
作为名称。
?`$`
中的相关行
两者[[和$选择列表中的单个元素。主要区别在于$不允许计算指数,而[[确实如此]。 x $ name相当于x [[“name”,exact = FALSE]]。此外,[[可以使用精确参数控制。
的部分匹配行为
您正尝试将value
和column
用作计算索引(即计算 value
和{{1} }被定义为),因此你需要column
。
该功能变为
`[[`
请注意,我还添加了一个参数pattern.record <- function(x, column="letters", value="one", pattern_list)
{
if (column %in% names(x))
{
result <- x[grep(pattern_list[[value]], x[[column]], ignore.case=T),]
}
else
{
result <- NA
}
return(result)
}
pattern.record(dataframez, patternlist = pattern_list)
## letters numbers otherletters
## 1 a 1 k
## 2 b 2 l
## 3 c 3 m
,因此它不依赖于父环境中某处存在的名为pattern_list
的对象(在您的情况下是全局环境。