在一個群里,看到一位朋友發(fā)了一堆代碼,
錯誤代碼
以及一個報錯信息,Error in paste(.....) :could not find function "paste←" (還有一個target of assignment expands to non-language object)
他非常不理解,為什么,明明paste的用法沒錯,sum的操作也沒有錯,但是代碼卻出錯了呢?
這個報錯,在我剛學習R語言的時候,也遇到過。當時,我也想著手動構(gòu)建一個變量名,然后給它賦值,方便后面調(diào)用,就跟我在shell腳本的操作一樣。
但實際上,這在R里面是行不通的,因為這相當于讓一個字符串充當變量名,最簡單的報錯就是 paste("a",1) <- sum(1:10)
其實,為一個值賦予一個名字,不是非得要變量名 = 變量值 這種形式,你可以用列表,數(shù)據(jù)框,命名向量。舉個例子,你計算了一堆值,每個值對應(yīng)一個基因,下面演示錯誤和正確的形式
# 錯誤形式
genename <- c("a","b","c","d", "f")
## 假設(shè)你計算的結(jié)果是x
x <- c(1:5)
for (i in seq(length(genename))){
# 想為每個基因名創(chuàng)建一個變量名,是不可行的
paste(genename[i]) <- x[i]
}
# 正確形式
genename <- c("a","b","c","d", "f")
x <- c(1:5)
x
for (i in seq(length(genename))){
# 將基因名
names(x)[i] <- genename[I]
}
x
假如你計算的結(jié)果不是一個數(shù)值,而是一個數(shù)據(jù)框,那么我們可以用列表(list)來存放變量
genename <- c("a","b","c","d", "f")
result <- list()
for (i in seq(length(genename))){
# 隨便算一個data.frame
df <- data.frame()
# 列表復(fù)制
result[[genename[i]]] <- df
}
result
即便最開始的代碼可行,也是非常糟糕的,因為你很有可能生成大量你自己都不知曉的變量。