我正在尝试过滤一些数据,R中的函数与数据帧相关.但在第二个函数中,它给出了以下错误:无法更改锁定绑定的值df.有人可以帮我吗?
顺便说一句,这是代码:
load.data = function(x,dir = ".") {
dados_reais <<- read.csv(paste(dir,x,sep="/"), header = FALSE, sep = "\t", dec = ".", col.names = c("Seq","Allele","Peptide","Identity","Pos","Core","Core-Rel", "Um-log50k(aff)","Affinity(nM)","Rank","Exp_Bind","Binding Level"))
}
filter.data = function(x, dir = ".") {load.data(x, dir) df <<- dados_reais[,c(1,2,3,4,9,10,12)}
Run Code Online (Sandbox Code Playgroud)
原因是<<-和<-工作不同。
x <- val表示“将值分配给当前作用域中val的名称x”。那是您通常应该使用的赋值运算符。
x <<- val表示“ x在当前作用域及其周围的作用域中搜索名称。找到它后,立即为其分配值val并停止。如果找不到它,则x在最广泛的作用域(全局)中创建一个新变量并为其分配值val。”
在您的情况下,您的名称选择df有些不走运:df在stats名称空间中有一个内置函数用于计算Snedecor的F分布函数的密度。您的<<-作业发现,试图将其值更改为dados_reais[,c(1,2,3,4,9,10,12)],并被拒绝(因为内置df函数是“锁定的”,即不可变的)。显示此问题的一个简单示例如下:
df <<- 5
# Error: cannot change value of locked binding for 'df'
Run Code Online (Sandbox Code Playgroud)
如图所示,R的变量和函数共享相同的名称空间(或更准确地说:R的函数通常存储在与所有其他变量相同的符号表[环境]中,它们不像许多其他语言那样“特殊”) 。那么这是否意味着您永远都不要使用与内置函数名称冲突的变量,例如dfor min或qor t?不,通常这没什么大不了的,因为当您这样做时min(x),R知道要查找一个称为的函数min,而不是任何一个称为的旧符号表条目min,因此它使用类似的方法get("min", mode="function")来确保不会意外地找到您已经找到的某个变量定义碰巧被称为min。
就是说,有时您会遇到一些偷偷摸摸的名字冲突。例如,如果您认为您有一个data.frame被叫df,但您却忘记了实际创建它,则可能会看到如下错误:
df[1, 5]
# Error in df[1, 5] : object of type 'closure' is not subsettable
Run Code Online (Sandbox Code Playgroud)
就是说,函数df(R中的函数是“关闭类型的对象”)不能用方括号索引。将其归档在大脑中的某个地方,因为如果您使用R足够长的时间,那么肯定会偶尔看到该错误。
你应该避免<<-.这产生了具有副作用的功能,这与功能语言的精神背道而驰.尝试
load.data <- function(x,dir = ".") {
read.csv(paste(dir,x,sep="/"), header = FALSE, sep = "\t", dec = ".", col.names = c("Seq","Allele","Peptide","Identity","Pos","Core","Core-Rel", "Um-log50k(aff)","Affinity(nM)","Rank","Exp_Bind","Binding Level"))
}
filter.data <- function(x, dir = ".") {
load.data(x, dir)[,c(1,2,3,4,9,10,12)]
}
df <- filter.data("mypath.csv")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9047 次 |
| 最近记录: |