R - 在用户定义的函数 R 中将字符串作为字符串传递
Posted
技术标签:
【中文标题】R - 在用户定义的函数 R 中将字符串作为字符串传递【英文标题】:R - Passing a string as a string in a user defined function R 【发布时间】:2018-10-25 10:55:13 【问题描述】:我正在尝试编写一个函数,它对包含某个字符串的数据集进行子集化。
模拟数据:
library(stringr)
set.seed(1)
codedata <- data.frame(
Key = sample(1:10),
ReadCodePreferredTerm = sample(c("yes", "prefer", "Had refer"), 20, replace=TRUE)
)
用户定义函数:
findterms <- function(inputdata, variable, searchterm)
outputdata <- inputdata[str_which(inputdata$variable, regex(searchterm, ignore_case=TRUE)), ]
return(outputdata)
我预计至少会返回几行,但是当我运行以下代码时得到 0:
findterms(codedata, ReadCodePreferredTerm, " refer") #the space in front of this word is deliberate
我意识到我正在尝试做一些非常简单的事情......但不知道为什么它不起作用。
注意,代码在未定义为函数时可以正常工作:
referterms <- codedata[str_which(codedata$ReadCodePreferredTerm, regex(" refer", ignore_case=TRUE)), ]
【问题讨论】:
可能是inputdata[str_which(inputdata[[variable]], regex(searchterm, ignore_case=TRUE)), ]
不幸的是,这不起作用。我想知道为什么符号“$”是错误的?
这里有很多重复的那个问题。您可以在help("$")
中找到答案。如果您需要更多帮助,您需要提供minimal reproducible example。
抱歉,请查看我的帖子已相应更新。
如果你将函数调用为findterms(codedata, "ReadCodePreferredTerm", " refer")
,我上面的代码可以正常工作(你应该这样做,在你更高级之前不要尝试编写具有非标准评估的函数)。
【参考方案1】:
你可以使用 dplyr 和 stringr 来简单地做到这一点
library(magrittr) # For the pipe (%>%)
library(dplyr)
library(stringr)
codedata %>%
dplyr::filter(str_detect(ReadCodePreferredTerm, '\\brefer\\b'))
如果您愿意,您也可以编写自己的函数,如果您不想为变量名传入字符串,您也需要 rlang。像这样的作品
library(rlang)
findterms <- function(df, variable, searchterm)
variable <- enquo(variable)
return(
df %>%
dplyr::filter(str_detect(!!variable, str_interp('\\b$ searchterm \\b')))
)
findterms(codedata, ReadCodePreferredTerm, 'refer')
【讨论】:
以上是关于R - 在用户定义的函数 R 中将字符串作为字符串传递的主要内容,如果未能解决你的问题,请参考以下文章