我正在尝试将函数参数传递给tidyr :: spread(版本tidyr_0.6),如下例所示。我的函数参数是一个字符串(变量名)。我收到了错误消息。有谁知道为什么?如何修改我的代码才能使其正常工作?
# data
stocks <- data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
stocksm <- stocks %>% gather(stock, price, -time)
#function
spread.data <- function (var){
var = sym(var)
stocksm %>% spread(stock, !!var)
}
spread.data('price')
我收到了错误消息。
Error: Invalid column specification
答案 0 :(得分:1)
我认为@ Z.lin的评论可能是正确的。这是一个使用rlang::sym
函数的可重现示例。注意,可以在不使用sym
功能的情况下实现相同的结果。我使用tidyr_0.7.0
来获得此结果:
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(rlang))
# data
stocks <- data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
stocksm <- stocks %>% gather(stock, price, -time)
# with rlang::sym function
spread.data <- function (var){
var = sym(var)
stocksm %>% spread(stock, !!var)
}
result1 <- spread.data('price')
# without sym function
spread.data <- function (var){
stocksm %>% spread(stock, !!var)
}
result2 <- spread.data('price')
identical(result1, result2)
#> [1] TRUE