将函数参数传递给tidyr :: spread

时间:2017-09-10 04:45:26

标签: r tidyr

我正在尝试将函数参数传递给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

1 个答案:

答案 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