2016-11-28 75 views
0

我知道我們可以使用assign爲字符名稱向量賦值。例如給索引的字符命名變量賦值一個

assign("target",1:5) 

但是,如果我們想改變target的第1個要素(target可以是一個向量/矩陣/列表),我們應該怎麼辦呢? target這裏也可以是一個矩陣,所以我們可以改變一個元素,一行或一列。 我想要做這樣的事情

target[1] <- 99 

如果我使用

assign("target[1]",99) 

只會產生一個新的對象名爲target[1]和值是99。下面是一個簡單和審判例如

# This function is meaningless, just used to show my situation 
# variable_name is a character 
example_function <- function(variable_name){ 
    assign(variable_name,1:5) 

    if(rnorm(1)>1){ 
    variable_name[1] <- 99 #This will not work and I just need some function to achive this purpose 
    } 
} 
example_function("justAname") 
+0

'目標[1] < - 99'正常工作...有什麼問題? –

+0

變量名是由函數內部生成的,所以當我們想要改變變量的一個元素時,我們不知道變量名 –

+0

assign()函數的作用是創建一個新的變量,其中第一個參數爲其名稱。這意味着在assign(「target」,1:5)之後,將會有一個新的變量,名爲'target',其值爲1到5.如果你執行'print(target)',你會看到你的新變量。因此,執行'target [1] < - 99'會把'target'當作一個正常的變量,讓你做這個任務。試試吧,它的工作原理 –

回答

1

作爲一種替代方法,您可以使用[<-函數。

f = function(variable_name){ 
    assign(variable_name,1:5) 
    if(rnorm(1)>1){ 
    `[<-`(eval(as.name(variable_name)),i = 1, value = 99) 
    } 
    get(variable_name) 
} 

這也應與矩陣

f_mat = function(variable_name){ 
    assign(variable_name,matrix(1:25,nrow = 5)) 
    if(rnorm(1)>1){ 
    `[<-`(eval(as.name(variable_name)),i = 1, j = , value = 99) # for 1st row 
    # `[<-`(eval(as.name(variable_name)),i = , j = 1, value = 99) # for 1st col 
    #specify i and j for ith row jth column 
    } 
    get(variable_name) 
} 

,並列出工作類似。

相關問題