Re: [问题] 档名字串当成变量,get()有时成功有时失败

楼主: LIAR (玻璃做的大叔)   2021-08-21 22:18:10
: → locka: 请提供可重现错误的程式码~ 08/21 11:47
: → locka: 是说我查get的说明,他是从命名空间(name space)中搜寻是否 08/21 11:53
: → locka: 有符合的物件,会不会是你选取档案的程式码并没有在命名空 08/21 11:53
: → locka: 间中?另外get(x)的x要用字串形式,不知道你为什么可以不用 08/21 11:53
: → locka: ?撇除这点,不知道是不是跟你赋值的动作有关?(总之没提供 08/21 11:53
: → locka: 程式码只能乱猜…坐等其他大大回复 哈哈哈) 08/21 11:53
以下是全部的log,先清除所有变量空间。
档名和表格都有成功存到变量空间。档名变量也是字串没问题。
> rm(list=ls(all.names = TRUE ))
> raw_name <- choose.files(caption = "Select a raw excel file", multi =
FALSE, filters = matrix(c("excel files", "*.xlsx", "CSV files", "*.csv"),
ncol = 2, byrow = TRUE))
> tableName <- strsplit(basename(raw_name), ".", fixed = TRUE)[[1]][1]
> library(magrittr)
> tableName %<>% paste("table", sep = "_");
> library(openxlsx)
> assign(tableName, read.xlsx(raw_name));
> get(tableName)$event_height[is.na(get(tableName)$event_height)] = "noData"
Error in get(tableName)$event_height[is.na(get(tableName)$event_height)] =
"noData" :
could not find function "get<-"
> is.na(get(tableName)$event_height)
[1] FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE FALSE
TRUE TRUE TRUE TRUE TRUE
[18] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE TRUE TRUE TRUE TRUE
[35] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
TRUE TRUE TRUE FALSE TRUE
[52] TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE
TRUE TRUE
get(tableName)是可以正常运作的。
> tableName
[1] "2020rib_selection version2_table"
我get的tableName确实存在,所以我故意单独呼叫这字串,贴回程式码取代get的
段落,就可以执行了。
> `2020rib_selection
version2_table`$event_height[is.na(get(tableName)$event_height)] = "noData"
> is.na(get(tableName)$event_height)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE FALSE FALSE FALSE
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE FALSE FALSE FALSE
[35] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE FALSE FALSE FALSE
[52] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE
取代成功,没有NA,都变成"noData"的字串。
其实我在意那句could not find function "get<-",但上网查找不到,
而且逻辑上也不懂为什么其他地方get都成功,但是要赋值时才出问题。
作者: andrew43 (讨厌有好心推文后删文者)   2021-08-21 22:29:00
应该只是因为get不能赋值。有些function可以,例如colname,在手册中会明确写出来见 help(colnames) 中有 "colnames(x) <-"所以你应该改用assign才对。这比较像是R设计的方式
楼主: LIAR (玻璃做的大叔)   2021-08-21 22:39:00
不过我是get后面接了$,是改变字段内容,不是get本身,这样也不行吗?
作者: locka (locka)   2021-08-21 23:02:00
查了一下 看来原因是这个:you can't assign something tothe result of a function. 这篇有比较详细的解释https://reurl.cc/ze3jnkget(x)做的事情其实是把x复制了一份并return 所以对copy的x赋值是不合R语法的;跟有没有用$指定字段没关系
楼主: LIAR (玻璃做的大叔)   2021-08-21 23:55:00
assign对$的字段,我测试失败耶?跑出一个名称超长变量:> `2020rib_selection version2_table$event_height[is...[1] "noData"这样的结果。@locka: 不过我return后接$字段有被承认,且我并非针对get的return去修改,这部分差异我还是搞不懂。
作者: locka (locka)   2021-08-22 00:10:00
是问为什么 '…'$height[is.na(get(x)$…)] <- value 会成功吗?这是因为你是对'…'$height[…]赋值,不是对get()回传的东西赋值啊。get(…)回传的东西就是复制的x
楼主: LIAR (玻璃做的大叔)   2021-08-22 00:16:00
阿...第一个超长变量那个是要回应 @andrew43说的assign方式至于get()$[...]有成功,我一直认为是get把字串贴上后就没事回家了,所以显示没问题。而赋值也是想说get()$到这边已经
作者: locka (locka)   2021-08-22 00:20:00
andrew大说的assign可能要搭配循环的写法才会得到你想要的结果
楼主: LIAR (玻璃做的大叔)   2021-08-22 00:21:00
进入字段阶端,get()应该功成身退,赋值是针对$...动作,为什不行?如果这样还不行,有没有其他方法可以解决?
作者: locka (locka)   2021-08-22 00:24:00
get(x)是copy x --> get(x)$height等于是copy x的height,不是x的heighthttp://i.imgur.com/MWNU8ex.jpg
作者: andrew43 (讨厌有好心推文后删文者)   2021-08-22 01:24:00
直接对list做assign也是copy。感谢提醒。建议此问题直接用简单的list来操作例。现在实在不易看懂

Links booklink

Contact Us: admin [ a t ] ucptt.com