2011-03-19 58 views
3

假設多個對象,你有一個列表變量a至j談到一次

for(x in 1:10) { 
assign(letters[x],x) 
} 

你怎麼會去評論那些新近創建的對象?我已經試過類似:

for(x in 1:10) { 
comment(get(letters[x])) <- paste(x) 
} 

,但似乎失敗。隨着:

Error in comment(get(letters[x])) <- paste(x) : 
    could not find function "get<-" 

我在這裏錯過了什麼?

回答

4

如果你曾經鑼希望循環,然後將它們存儲在一個列表中。它使生活更輕鬆。但如果你真的想這樣做,你可能只需要在一個eval(解析環路(thingum:

> for(i in 1:10){ 
+ eval(parse(text=paste("comment(",letters[i],")<-'",as.character(i*2),"'",sep=""))) 
+ } 
+0

'require(fortune);財富(106)';-) – 2011-03-20 12:09:34

2

不能賦值給一個返回的變量,請參閱:

> x <- 'cars' 
> get(x) <- 1 
Error in get(x) <- 1 : could not find function "get<-" 

但讀/加載返回的變量的註釋是可能的get,請參閱:

> comment(cars) <- "test" 
> comment(get(x)) 
[1] "test" 

您可能會將您的變量連接到例如列表和評論列表中的元素,如:

> l <- list(a=1,b=2,c=3) 
> for (x in 1:3) { 
+  comment(l[[letters[x]]]) <- paste(x) 
+ } 
> str(l) 
List of 3 
$ a: atomic [1:1] 1 
    ..- attr(*, "comment")= chr "1" 
$ b: atomic [1:1] 2 
    ..- attr(*, "comment")= chr "2" 
$ c: atomic [1:1] 3 
    ..- attr(*, "comment")= chr "3" 

如果你堅持要用不同的變量,他們只是在給定的列表,如:

> attach(l) 
The following object(s) are masked _by_ '.GlobalEnv': 

    a, b, c 
> a 
[1] 1 
> str(a) 
atomic [1:1] 1 
- attr(*, "comment")= chr "1" 
2

試試這個:

# sample data 
letters <- setNames(as.list(1:10), LETTERS[1:10]) 

for(i in 1:10) { 
    temp <- letters[[i]] 
    comment(temp) <- paste(i) 
    letters[[i]] <- temp 
} 
2

另一方案是get()對象並將其分配一個局部對象。註釋附加到本地對象,然後分配給它回全局工作區。

> for(x in 1:10) { 
+  assign(letters[x],x) 
+ } 
> 
> a 
[1] 1 
> comment(a) 
NULL 
> 
> for(x in 1:10) { 
+  obj <- get(letters[x]) 
+  comment(obj) <- paste(x) 
+  assign(letters[x], obj) 
+ } 
> ## cleanup 
> rm(obj) 
> a 
[1] 1 
> comment(a) 
[1] "1" 

之所以代碼沒有工作是,有沒有替代FUNC版本號爲get(),因此有關get<-()的錯誤消息。

將列表中的對象存儲在列表中,因爲其他列表中提到的內容會更容易管理,因此您沒有大量的對象堵塞全局工作區,但上面顯示瞭如何修改示例代碼以實現您想要的結果。

+0

我會進一步調查名單。我目前沒有使用它們,是的,當我輸入ls()時,如果我沒有提供變量名稱的命名,它可能有點壓倒性。 – 2011-03-20 23:16:21