Как переименовать объекты списка в самоопределяемой функции?
quote <- function(namefoo, namebar){
set.seed(3)
foo <- rnorm(n = 5)
bar <- rnorm(n = 5)
return(list(namefoo=foo,namebar=bar))
}
Из вышеупомянутой функции, если я побежал quote(test, test1)
имя двух объектов в списке остается namefoo
а также namebar
вместо того, что я указал в вызове функции.
Если бы я просто запустил код отдельно как:
set.seed(3)
foo <- rnorm(n = 5)
bar <- rnorm(n = 5)
obj <- list(test=foo,test1=bar)
Тогда obj вернется foo
а также bar
с измененными именами. Как мне заставить мою функцию делать это? Я пробовал также несколько комбинаций, включая кавычки, от вызова функции до самой функции, но, похоже, она не работает.
3 ответа
Это очень плохая идея назвать вашу функцию quote
очень важно R
Функция называется просто так.
использование setNames
:
fun <- function(namefoo, namebar){
set.seed(3)
foo <- rnorm(n = 5)
bar <- rnorm(n = 5)
setNames(list(foo,bar),c(namefoo, namebar))
}
fun("hi","there")
# $hi
# [1] -0.9619334 -0.2925257 0.2587882 -1.1521319 0.1957828
#
# $there
# [1] 0.03012394 0.08541773 1.11661021 -1.21885742 1.26736872
Вы также можете увидеть этот код вокруг, используя более продвинутые функции rlang
/ tidyverse
:
library(tidyverse)
fun2 <- function(namefoo, namebar){
set.seed(3)
foo <- rnorm(n = 5)
bar <- rnorm(n = 5)
lst(!!namefoo := foo,!!namebar := bar)
}
fun2("hi","there")
# $hi
# [1] -0.9619334 -0.2925257 0.2587882 -1.1521319 0.1957828
#
# $there
# [1] 0.03012394 0.08541773 1.11661021 -1.21885742 1.26736872
Одним из способов является это:
quote <- function(namefoo, namebar){
set.seed(3)
foo <- rnorm(n = 5)
bar <- rnorm(n = 5)
out <- list(foo, bar)
names(out) <- c(namefoo, namebar)
out
}
Вы можете сохранить список в переменной, а затем назвать элементы с помощью names
,
# quote('foo', 'bar')
# $namefoo
# [1] -0.9619334 -0.2925257 0.2587882 -1.1521319
# [5] 0.1957828
#
# $namebar
# [1] 0.03012394 0.08541773 1.11661021
# [4] -1.21885742 1.26736872
Мы можем
quotefn <- function(...) {
nm <- c(...)
out <- replicate(length(nm), rnorm(n = 5), simplify = FALSE)
names(out) <- nm
out}
quotefn("foo", "bar")
#$foo
#[1] -0.5784837 -0.9423007 -0.2037282 -1.6664748 -0.4844551
#$bar
#[1] -0.74107266 1.16061578 1.01206712 -0.07207847 -1.13678230