2014-08-19 5 views
-2

Я пытаюсь построить динамическую функцию, использующую Eval, разобрать, или что-то работаетR - передать глобальную переменную в функцию, изменить его и сохранить

Намерение функции: значение сеттера. вход

Параметр: список, имя элемента списка, значение

Возврат: не интересует

Текущий код

#call fun_lsSetValue(state_list,selected,"dropdown") 

fun_lsSetValue <- function(ls,name,value){ 
pars <- as.list(match.call()[-1]) 
element <- as.character(eval(expression(pars$name))) 
if(is.null(value)) 
    eval(parse(text="ls[[element]] <- ''")) 
else 
    eval(parse(text="ls[[element]] <- value")) 

#part that I need help, I need to assign ls to "state_list" without 
#having to hard coded it in this function 
#I have tried everything I can think of like 
#assign(deparse(substitute(ls)),ls,.GlobalEnv) 
#state_list <<- ls works, but I want to be dynamic 
} 

Проблема, которую я нашел, мне нужно передать значение локальной переменной «ls», где она исходила из динамического состояния (state_list) Я знаю a < - функция (a, name, value) {... return (a)} работает, но этот синтаксис действительно не является моим предпочтением. Поскольку я пытаюсь узнать, можно ли сделать то же самое без назначенной стороны функции. Любое пособие было бы полезно.

+1

прологе на этот вопрос ... просто неправильно. В R стратегия состоит в том, чтобы вернуть значение, а не «установить» значение. Существует функция '<< -', которая, вероятно, работает лучше, чем вы кодируете, но она устарела для регулярного использования. Может, вам нужен другой язык? –

+1

Остановите пытать часть языка, чтобы заставить его делать то, что он не был предназначен. Используйте одну из реальных систем ОО, таких как S4, ссылочные классы, proto, R6 и т. Д. – joran

+0

Сделайте шаг назад - сообщите нам, что делает ваш более крупный код. Возможно, мы сможем помочь вам сделать то, что вы пытаетесь, таким образом, чтобы в долгосрочной перспективе вы стали намного счастливее. – waternova

ответ

1

Несмотря на то, что это ужасная идея в общем, что-то вроде

fun_lsSetValue <- function(ls,name,value){ 
    lsname <- deparse(substitute(ls)) 
    name <- deparse(substitute(name)) 
    ls <- get(lsname, envir=globalenv()) 
    if(is.null(value)) { 
     value<-'' 
    } 
    ls[[name]]<-value 
    assign(lsname, ls,envir=globalenv()) 
} 

должен работать

a <- list(x=1) 
fun_lsSetValue(a,x,3) 
a 
# $x 
# [1] 3 
+0

Спасибо за оперативную обратную связь. Какова будет наилучшая практика для такого сценария? –

+0

Это зависит от того, почему вы считаете, что этот тип функции необходим. Вы пытаетесь имитировать объектно-ориентированное программирование? Вы пытаетесь что-то автоматизировать? Это совсем не так, как любой, кто вообще знаком с R, ожидает, что все будет сделано, чтобы создать кошмар для обслуживания и отладки. – MrFlick

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