我想在a
中获取变量的名称,并在b
a <- list(EURUSD,USDJPY,CADJPY)
b <- c("EURUSD", "USDJPY", "CADJPY")
我该怎么办而不是手动编写?
答案 0 :(得分:3)
首先,R懒惰地评估,但是当您将列表分配给变量a
时,表达式list(EURUSD, USDJPY, CADJPY)
得到了评估。除非这三个对象被命名并且名称完全相同,否则无法获得它们的名称。
您可以尝试解析ls()
的输出:在命名空间中查找所有6个字符的全部大写名称。
示例:
EURUSD <- runif(10)
USDJPY <- runif(10)
CADJPY <- runif(10)
blablabla <- 'unused variable'
currency_pairs <- ls(pattern='^[A-Z]{6}$')
print(currency_pairs)
[1] "CADJPY" "EURUSD" "USDJPY"
答案 1 :(得分:1)
我们可以使用substitute
f1 <- function(...) {
v1 <- sapply(as.list(substitute(list(...)))[-1], deparse)
v2 <- unlist(strsplit(v1, "list|[(), ]"))
v2[nzchar(v2)]
}
f1(EURUSD)
#[1] "EURUSD"
f1(list(EURUSD, USDJPY))
#[1] "EURUSD" "USDJPY"
f1(list(EURUSD,USDJPY,CADJPY))
#[1] "EURUSD" "USDJPY" "CADJPY"
EURUSD <- 1:10
USDJPY <- 11:20
CADJPY <- 21:30
答案 2 :(得分:0)
我们无法创建a
,然后通过检查a
本身来确定进入它的变量名称,因为在创建a
时,变量名称将丢失;但是,我们可以创建一个函数namify
,而不是a
而是list(EURUSD, USDJPY, CADJPY)
。在这种情况下,函数可以解析输入表达式并对其进行评估。
namify <- function(x) {
setNames(x, sapply(substitute(x)[-1], deparse))
}
# test it
EURUSD <- USDJPY <- CADJPY <- 1
L <- namify(list(EURUSD, USDJPY, CADJPY))
给出这个命名列表:
> L
$EURUSD
[1] 1
$USDJPY
[1] 1
$CADJPY
[1] 1
names(L)
和unname(L)
分别是名称和未命名列表。
请注意,实现所有这一切的首选方法是首先从命名列表开始。例如,假设每个变量都存储在当前目录中的csv文件中:
csvFiles <- Sys.glob("*.csv")
L <- Map(read.csv, csvFiles)
names(L) <- sub("[.]csv$", "", names(L)) # remove .csv from names