R-合并变量和字符串

时间:2018-07-24 22:17:39

标签: r function parsing

我创建了R函数,用于从数据库加载数据。该功能的一部分看起来像这样

var client  = mqtt.connect('mqtt://192.168.0.22')

我想允许用户使用函数中的解析参数来更改代码中所有出现的“ sk”。通常,我使用合并变量和字符串paste()函数的方法,但是我没有在这里发现如何做到这一点。

例如,如果用户调用将调用此函数

cars <- function(sk) {
    get_data <- tbl(ff_ba, "sk_cars") %>%
      filter(id %in% sk_cars_ids$id) %>%
      collect()
  return(get_data)
}

函数内部的代码应为

cars(us)

1 个答案:

答案 0 :(得分:0)

无法访问数据库,我无法确认它是否有效,但是我认为您将能够使用deparse(substitute())get()来完成所需的工作。这是一个使用mtcars数据集的愚蠢示例。

首先,一些过滤数据框代替了x_cars_ids数据框:

mpg_values <- data.frame(values = c(27.3, 30.4, 33.9))
disp_values <- data.frame(values = 100:300)

现在该功能,注释中有详细信息:

custom_filter <- function(prefix) {
  # Convert the input to a string value
  input <- deparse(substitute(prefix))

  # Use get to call the correct filtering df
  filter_df <- get(paste(input, "_values", sep = ""))

  # Subset using the string value
  out <- mtcars[mtcars[input] > 25, ] %>%
    # filter using the df called by 'get', treating
    # the input as our desired filtering variable
    # just for this example
    filter(get(input) %in% filter_df$values)
  return(out)
}

现在使用适当的变量名称调用该函数将基于该变量过滤mtcar:

> custom_filter(mpg)
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2
2 33.9   4 71.1  65 4.22 1.835 19.90  1  1    4    1
3 27.3   4 79.0  66 4.08 1.935 18.90  1  1    4    1
4 30.4   4 95.1 113 3.77 1.513 16.90  1  1    5    2


> custom_filter(disp)
   mpg cyl disp  hp drat    wt  qsec vs am gear carb
1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
5 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
6 19.7   6  145 175 3.62 2.770 15.50  0  1    5    6
7 21.4   4  121 109 4.11 2.780 18.60  1  1    4    2

希望这能使您指向正确的方向。