2013-12-21 2 views
1

У меня есть ряд переменных и значений:Как изменить значения переменных на имена переменных?

var1<- "MyVar1" 
var2<- "MyVar2" 
... 
varN<- "MyVarN" 

values1 <- c("a","b", "c") 
values2 <- c("d","e", "f", "g") 
... 
valuesN <- c(...) 

Числа N и значение varX и значение х, известны во время выполнения (поставляется пользователем).

мне нужно, чтобы превратить их в качестве параметра функции, такие как:

globalvar = list(MyVar1=c("a","b", "c"), MyVar2=c("d","e", "f", "g"), ... varN=c(...)) 

, а затем поставить его к функции MyFunction():

myfunction(globalvar = list(MyVar1=c("a","b", "c"), MyVar2=c("d","e", "f", "g"), ... varN=c(...)), other_parameters) 

ответ

2

Вот более краткий способ сделать это:

# Helper function to extract values/names 
read <- function (prefix) function (i) get(paste0(prefix, i)) 

# Collect arguments 
args <- setNames(lapply(1 : N, read('values')), lapply(1 : N, read('var'))) 

# Call function 
myfunction(globalvar = args, other_parameters) 

Коллекция аргумент все еще содержит небольшое повторение, так как мы делаем по существу то же самое для значений и их имена, но я думаю, что это допустимо здесь, в поскольку мы обобщили их фактическую работу в помощнике read.

Обратите внимание, что ваше решение с использованием отдельной среды на самом деле не требуется. Фактически вы просто копируете переменные от myListe в новый список tmp запутанным способом.

+0

Хороший и лаконичный :-) Спасибо Konrad! – massinissa

1
var3 <- list(values1, values2, ..., valuesN) 
names(var3) <- c("MyVar1", "MyVar2", ... "MyVarN") 
0

Наконец я пришел с этим раствор:

myListe <- list()  
    for (i in 1:N) { 
     var.name   <- get(paste("var",i,sep="")) 
     var.values  <- get(paste("values",i,sep="")) 

     myListe[i]  <- list(var.values) 
     names(myListe)[i] <- list(var.name) 

    } 

    tmp  <- new.env() ; assign('globalvar',as.list(myListe),envir=tmp) 

А затем Я называю функцию myfunction() следующим образом:

do.call(myfunction, c(as.list(tmp),as.list(other_parameters))) 

Есть ли более краткий способ сделать то же самое?

+2

Более кратким способом сделать это будет использование векторов/списков вместо нумерованных переменных. Фактически, простое существование этих пронумерованных переменных является проблемой. Не делай этого. –

+0

Согласен. Однако переменные генерируются другой программой. Короче говоря, я имею в виду использование лапши или что-то подобное, чтобы избежать цикла for. Благодарю. – massinissa

Смежные вопросы