2013-03-16 153 views
3

我有一個函數,它使用readline來允許用戶輸入他想給我爲他們創建的變量的名稱。我們稱之爲「USER.DEFINED.VARIABLE」。它包含我想用於另一個變量的名稱。假設「USER.DEFINED.VARIABLE」被readline設置爲「jimsfilename」。如何使用變量來命名R中的另一個變量?

我知道我可以將值分配給一個名爲「jimsfilename」使用變量:

assign(USER.DEFINED.VARIABLE,c(1,2,3,4,5)) 

「jimsfilename」現在有它1,2,3,4,5。然而,我現在怎麼做「jimsfilename」,因爲我沒有(在readline分配給USER.DEFINED.VARIABLE之前)知道它的名字是什麼?

換句話說,我們可以說我現在要給jimsfilename中的每個值加1。我不能這樣做:

USER.DEFINED.VARIABLE <- USER.DEFINED.VARIABLE + 1 # can't do this 

因爲「USER.DEFINED.VARIABLE」實際上是一個文本字符串名稱。我想要引用jimsfilename,但我擁有的是USER.DEFINED.VARIABLE來表示它。我敢肯定,這是一件很容易...

+0

@Dason,這不是重複的,它只是模糊地相關...而你提到的帖子幾乎不可讀。 – 2013-03-16 21:00:49

+3

@ Ferdinand.kraft然後建議一個不同的副本。我連接的帖子甚至在24小時前都沒有問過,基本前提是一樣的。答案是使用'get'和'assign'。這個問題已經被問及了足夠多的時間。 – Dason 2013-03-16 21:06:46

回答

5

這取決於位上,你想做的事,但在這裏是用get函數的例子:

x<-1 
get(name)+1 
[1] 2 
assign(name,get(name)+1) 
x 
[1] 2 
0

您可以使用evalparse。後者將文本解釋爲它在控制檯中的輸入。第一個評估表達式(例如由parse生成)。例如:

> varname <- "user.defined.variable" 
> varvalue <- 42 
> eval(parse(text=paste(varname, varvalue, sep=" <- ")), envir=.GlobalEnv) 
> ls() 
[1] "user.defined.variable" "varname"    "varvalue"    
> user.defined.variable 
[1] 42 

請注意,我選擇了全局環境作爲新變量的目的地。如果情況並非如此,您可以進行適當的更改。

稍後要引用新變量,可以使用as.symbol。只是評估它的環境下,你分配的新變量:

> eval(as.symbol(varname), envir=.GlobalEnv) 
[1] 42 

您還可以使用substitute創建表達式eval可以理解:

> eval(substitute(x+1, list(x=as.symbol(varname))), envir=.GlobalEnv) 
[1] 43 

要更改新的變量,只是科瑞賦值表達式並對它們進行評估:

> eval(substitute(x <- x*10, list(x=as.symbol(varname))), envir=.GlobalEnv) 
> eval(as.symbol(varname), envir=.GlobalEnv) 
[1] 420 
+1

我認爲您正在向語言複雜性暴露出一些新用戶,這些語言複雜性並不是必需的,並且更容易用'get'解決。 – 2013-03-16 21:51:11

+0

非常贊同@DWin。我很想試着回答這個問題,因爲我認爲這是一個非常糟糕的建議,儘管我可以看到它是誠意提供的。 – 2013-03-16 22:23:59

+0

@BenBolker,@DWin。大家好,我們不要低估我們的新用戶......當我是R的新手時,我對所有'deparse'和'substitutes'感到困惑。但是,接觸它並沒有給我帶來什麼影響,除了刺激我真正理解發生了什麼之外。如果我想出來(至少在某種程度上,無限大於零),那麼其他人也可以解決它。 – 2013-03-17 00:33:42

3

爲什麼不只是對變量進行所有操作(將1或其他c hanges)複製到變量的本地副本中,然後在函數/腳本的末尾/分配或其他保存的內容?這會比創建變量簡單得多,然後必須使用get來獲取副本,將其更改,然後再次使用assign

更好的方法是在函數中使用自己的變量名稱,然後返回結果並讓用戶決定在那一點上命名它。這是更加Rish的做事方式,最好不要使用assign函數。通過使用列表和下標,大多數可以使用assign完成的事情可以更簡單地完成。

函數不應改變全局環境中的任何內容,只返回用戶可能需要的任何值並讓用戶進行分配。

+0

+1 - 是的,使用一個列表。而不是'assign'做'aList [[USER.DEFINED.VARIABLE]] < - c(1,2,3,4,5)'而不是'get'做'aList [[USER.DEFINED.VARIABLE]] < - aList [[USER.DEFINED.VARIABLE]] + 1'。 – flodel 2013-03-16 22:13:26

相關問題