Как переименовать объекты списка в самоопределяемой функции? - PullRequest
0 голосов
/ 07 сентября 2018
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 ]

0 голосов
/ 07 сентября 2018

Это очень плохая идея назвать вашу функцию 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
0 голосов
/ 07 сентября 2018

Мы можем сделать

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
0 голосов
/ 07 сентября 2018

Одним из способов является это:

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
...