获取 R 函数返回的变量名
get the name of variable returned by R function
我有这个代码:
library(magrittr)
a <- function(cars) return(cars)
b <- function(x) return(list(varname = deparse(substitute(x)), content = x))
b(cars)
returns 包含字符串 cars
和 data.frame cars
.
的内容的列表
任何方法都可以 a(cars) %>% b()
也 return 字符串 cars
(变量的名称 return 由函数 a()
编辑)和data.frame的内容?
相反,它 returns .
和 data.frame.
的内容
也就是说,我希望第二个函数 return 由第一个函数 return 编辑的变量名称以及变量的内容。
我实际上想用 b()
做的是 write.csv(x, paste0(deparse(substitute(x)), ".csv"))
。
有什么建议吗?
如果您查看 %>%
运算符内的调用堆栈,您会得到类似这样的内容
a(cars) %>% (function(x) sys.calls())
# [[1]]
# a(cars) %>% (function(x) sys.calls())
# [[2]]
# withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
# [[3]]
# eval(quote(`_fseq`(`_lhs`)), env, env)
# [[4]]
# eval(expr, envir, enclos)
# [[5]]
# `_fseq`(`_lhs`)
# [[6]]
# freduce(value, `_function_list`)
# [[7]]
# withVisible(function_list[[k]](value))
# [[8]]
# function_list[[k]](value)
# [[9]]
# (function (x) sys.calls())(.)
您可以看到当您的函数最终被调用时,您与原始表达式相距相当多的级别。问题是参数可能已在链中重新分配。考虑这种情况
a <- 6
b <- a
f <- function(x) deparse(substitute(x))
f(b)
# [1] "b"
但 R 无法知道 b
实际上来自 a
。没有办法通过这样的任务向后走。 substitute
只有当您仍然可以访问传递给函数的承诺时,才会这样工作。
所以问题是当你的函数在链中被调用时,它已经被重新分配给 .
这就是为什么你不能再访问原来的 "name".
我有这个代码:
library(magrittr)
a <- function(cars) return(cars)
b <- function(x) return(list(varname = deparse(substitute(x)), content = x))
b(cars)
returns 包含字符串 cars
和 data.frame cars
.
任何方法都可以 a(cars) %>% b()
也 return 字符串 cars
(变量的名称 return 由函数 a()
编辑)和data.frame的内容?
相反,它 returns .
和 data.frame.
也就是说,我希望第二个函数 return 由第一个函数 return 编辑的变量名称以及变量的内容。
我实际上想用 b()
做的是 write.csv(x, paste0(deparse(substitute(x)), ".csv"))
。
有什么建议吗?
如果您查看 %>%
运算符内的调用堆栈,您会得到类似这样的内容
a(cars) %>% (function(x) sys.calls())
# [[1]]
# a(cars) %>% (function(x) sys.calls())
# [[2]]
# withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
# [[3]]
# eval(quote(`_fseq`(`_lhs`)), env, env)
# [[4]]
# eval(expr, envir, enclos)
# [[5]]
# `_fseq`(`_lhs`)
# [[6]]
# freduce(value, `_function_list`)
# [[7]]
# withVisible(function_list[[k]](value))
# [[8]]
# function_list[[k]](value)
# [[9]]
# (function (x) sys.calls())(.)
您可以看到当您的函数最终被调用时,您与原始表达式相距相当多的级别。问题是参数可能已在链中重新分配。考虑这种情况
a <- 6
b <- a
f <- function(x) deparse(substitute(x))
f(b)
# [1] "b"
但 R 无法知道 b
实际上来自 a
。没有办法通过这样的任务向后走。 substitute
只有当您仍然可以访问传递给函数的承诺时,才会这样工作。
所以问题是当你的函数在链中被调用时,它已经被重新分配给 .
这就是为什么你不能再访问原来的 "name".