有人能帮我看看我哪里出错了吗?我认为在管道函数中使用花括号时,您可以调用变量而不必将其括在“”(即作为字符串)。那么我的函数哪里出错了:
library(tidyverse)
dat <- structure(list(id = 1:6,
var_1 = c("1,1,-11000", "1,1,1", "0,0,0", "1,1,0", "1,1,1", "1,1,1"),
var_2 = c("0,0,-13000", "0,0,0", "-13000,-13000,-13000", "6,4,-13000", "0,0,0", "0,0,0"),
var_3 = c("24,7,-13000", "0,0,0", "-13000,-13000,-13000", "0,0,-13000", "0,0,0", "0,0,0")),
row.names = 1:6, class = "data.frame")
# Separate to wide and convert to long in one step
split_to_long <- function(col){
i <- substr({{col}}, 5, 5)
temp <- dat |>
select("id", {{col}}) |>
separate_wider_delim({{col}}, ",", too_few = "align_start",
names = c(paste0({{col}},"_1"),
paste0({{col}},"_2"),
paste0({{col}},"_3"))) |>
pivot_longer(2:4,
names_to = "visit",
values_to = paste0("var_", i),
names_prefix = paste0("var_", i, "_"))
temp
}
# This works
split_to_long("var_1")
# But this doesn't
split_to_long(var_1)
这来自我发布的另一个问题: 如何用 purrr::map 替换这个 for 循环
{{...}} 仅在 tidyverse 函数中起作用,即使如此也只能在准引用上下文中起作用,但
substr
甚至不是一个 tidyverse 函数,更不用说提供准引用上下文了。如果
split_to_long
问题没有改变,请编写一个包装器来捕获使用enexpr
rlang 的参数,将其转换为字符,然后使用它。或者我们可以
split_to_long
像这样修改,修改后的行在下面用 ## 标记。我们还简化了最后一行标记为 ## 的行。如果希望两者同时起作用,可以使用该函数对代码进行一些修改
substitute
。我还建议在函数中包含一个数据参数。