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 中将字符串作为字符串传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 R 函数中使用文本字符串作为变量

在R中创建一个函数,在整个数据帧中将字符串转换为整数

如何在 R 中使用颜色十六进制值作为函数参数?

如何在用户定义的函数中将数据库列作为参数传递?

将参数传递给从 R 中的字符串调用的用户定义函数的最佳方法是啥?

在R中的sqldf中将整数转换为字符串