首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从函数内部传递要在tq_mutate (TidyQuant)中选择的变量列表?

如何从函数内部传递要在tq_mutate (TidyQuant)中选择的变量列表?
EN

Stack Overflow用户
提问于 2018-12-20 04:42:18
回答 1查看 262关注 0票数 2

如何修改我的代码,以便在从函数内部调用时可以将变量列表传递给tq_mutate中的select

以下代码在函数外部调用时有效,但在函数内部调用时无效:

(编辑后添加可重现的示例):

代码语言:javascript
复制
library(tidyquant)

# WORKS
x <- data_frame(date=seq(as.Date('2018-01-01'),as.Date('2018-01-10'),by=1), a=seq(1,10,by=1), b=seq(11,20,by=1))
k=c(1,2)

lag_cols <- c('a', 'b')

temp_names <- crossing(lag_cols, k)
temp_names <- temp_names %>% arrange(k, lag_cols)
col_names <- paste0(temp_names$lag_cols, '_lag', temp_names$k)

result <- x %>% tq_mutate(
    select = c('a', 'b'),
    mutate_fun = lag.xts,
    k = k,
    col_rename=col_names)

result

# DOESN'T WORK
lag_data <- function(df, k) {
  lag_cols_in <- c('a', 'b')

  temp_names <- crossing(lag_cols_in, k)
  temp_names <- temp_names %>% arrange(k, lag_cols_in)
  col_names <- paste0(temp_names$lag_cols_in, '_lag', temp_names$k)

  df %>% tq_mutate(
      select = lag_cols_in,
      mutate_fun = lag.xts,
      k = k,
      col_rename=col_names)
}

根据我的阅读,当在函数内调用时,tq_mutate使用select_,因此我需要将.dots=c('a','b','c')调用传递给select

如何修改代码以传递变量列表?请注意,将select=c('a', 'b')放在tq_mutate调用中在这两种情况下都有效,所以我猜测这与环境和变量作用域有关。

以下是错误消息:

代码语言:javascript
复制
Error in .f(.x[[i]], ...) : object 'lag_cols_in' not found
23.
.f(.x[[i]], ...)
22.
map(.x[sel], .f, ...)
21.
map_if(quos, !is_helper, eval_tidy, mask)
20.
vars_select_eval(.vars, quos)
19.
tidyselect::vars_select(names(.data), !!!quos(...))
18.
select.data.frame(.data, !!!dots)
17.
select(.data, !!!dots)
16.
select_.data.frame(data, select)
15.
dplyr::select_(data, select)
14.
tq_transmute_.tbl_df(data = data, select = select, mutate_fun = mutate_fun, col_rename = col_rename, ... = ...)
13.
tq_transmute_(data = data, select = select, mutate_fun = mutate_fun, col_rename = col_rename, ... = ...)
12.
tq_mutate_.tbl_df(data = data, select = lazyeval::expr_text(select), mutate_fun = lazyeval::expr_text(mutate_fun), col_rename = col_rename, ... = ...)
11.
tq_mutate_(data = data, select = lazyeval::expr_text(select), mutate_fun = lazyeval::expr_text(mutate_fun), col_rename = col_rename, ... = ...)
10.
tq_mutate(., select = lag_cols_in, mutate_fun = lag.xts, k = k, col_rename = col_names)
9.
function_list[[k]](value)
8.
withVisible(function_list[[k]](value))
7.
freduce(value, `_function_list`)
6.
`_fseq`(`_lhs`)
5.
eval(quote(`_fseq`(`_lhs`)), env, env)
4.
eval(quote(`_fseq`(`_lhs`)), env, env)
3.
withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
2.
df %>% tq_mutate(select = lag_cols_in, mutate_fun = lag.xts, k = k, col_rename = col_names)
1.
lag_data(x, k)
EN

回答 1

Stack Overflow用户

发布于 2018-12-20 06:29:09

也许有一个更好的方法,但这似乎是有效的。

代码语言:javascript
复制
library(tidyquant)
x <- data_frame(date=seq(as.Date('2018-01-01'),as.Date('2018-01-10'),by=1), a=seq(1,10,by=1), b=seq(11,20,by=1))
k <- c(1,2)
lag_data <- function(df, k) {
  lag_cols_in <- c('a', 'b')
  temp_names <- crossing(lag_cols_in, k)
  temp_names <- temp_names %>% arrange(k, lag_cols_in)
  col_names <- paste0(temp_names$lag_cols_in, '_lag', temp_names$k)

  df %>% tq_mutate(
      select = lag_cols_in[1:length(lag_cols_in)],
      mutate_fun = lag.xts,
      k = k,
      col_rename = col_names)
}

lag_data(x,k)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53858865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档