2014-09-10 50 views
0

這是一個後續行動這個問題我在前面如何賦值給名稱的矢量貼:R: How do I concisely assign names to vector parameter components?如何獲得保留我賦值的函數? (R)

我想賦值給名稱的載體,我需要做到這一點下面代碼中的函數形式的多個不同的函數。我不想將代碼插入到每個函數中,而是希望在下面編寫一個形式爲function1的子例程,並在每個函數中調用它。不幸的是,當我調用它時,名稱賦值保留在function1中,並且不能在「return(adam + ...)」部分中使用。我懷疑這是如何指定分配函數的環境,但我不知道如何解決它(我不想全局分配名稱)。誰能幫忙?

粗糙的代碼我試圖使用低於:

function1 <- function(vector, names){ 

for (i in 1:length(vector){ 

    assign(names[i], vector[,i], envir = environment()) 
} 

} 

function2 <- function(vector){ 

names1 <- c("adam", "becky", "charlie",...) 

function1(vector,names1) 

return(adam + becky^2 - 2*charlie*david +...) 

} 
+1

我會避免使用'assign'和全局變量/環境headeach。使用一個「命名向量」/列表,在其中設置所有變量。 – agstudy 2014-09-10 15:42:03

+2

您需要研究函數式編程和R的概念。你讓這些事情比自己所需要的更加困難。 – Roland 2014-09-10 15:51:22

+0

+1 Roland。閱讀本文,這基本上是R的手冊http://www.burns-stat.com/pages/Tutor/R_inferno.pdf – hedgedandlevered 2014-09-10 15:53:30

回答

1

你不想寫名字分配的功能,更遑論一個包含一個循環。

改爲使用命名向量。 例如:

vec1 <- c("this","that","the other") 
vec2 <- c(5,7,9) 
names(vec2) <- vec1 

那麼這個作品

vec2['that'] <- vec2['that'] + 1 
print(vec2) 
this  that the other 
    5   8   9 
+0

謝謝,但我想要做的不是命名條目,而是實際給這些名稱的值。所以在我上面的例子中,我想讓「adam」具有值向量[1]。 – LIPD 2014-09-10 17:09:10

+0

這是可以做到的,但除非你是專門爲代碼高爾夫或說明性原因這麼做的,否則對於可讀性,速度和靈活性而言,這是一個較差的實現。問題主要在於它禁止你在所有變量上進行任何類型的組操作,而不用按名稱單獨列出它們,這就違背了製作函數的要點;如果你確切地知道你想要對每個名字做什麼(因爲你使它們成爲常量),你不需要函數。只需列出全局範圍中的每個名稱,並將所需的值放入其中即可。 – hedgedandlevered 2014-09-10 17:30:23

+0

...如果有太多的「常量」變量需要這樣做,那麼它不是你想要做的。 – hedgedandlevered 2014-09-10 17:34:36

0

你可以試試:

function1 <- function(vector, names, envir){ 
for (i in 1:length(vector)){ 
assign(names[i], vector[i], envir = envir) 
} 
} 

function2 <- function(vector){ 
names1 <- c("adam", "becky", "charlie", "david") 
function1(vector,names1, envir=environment()) 
return(adam + becky^2 - 2*charlie*david) 
} 


v1 <- 1:4 
function2(v1) 
#[1] -19 
adam 
#Error: object 'adam' not found