oracle - ROracle 在 R 中创建阴影或不可见列
问题描述
使用通过 ROracle 读入 Rstudio 服务器的 data.frame,我遇到了一些非常奇怪的行为。数据中似乎有一个额外的列,R 起初似乎没有检测到,但仍然非常多。
我之前不知道oracle隐藏域,遇到了这个,这可以解释这种现象。 什么是 Oracle 隐藏字段?
然而,这对我来说仍然非常奇怪,这在 R 中甚至是可能的,而且不一致之处令人困惑。当然,这个例子是不可复现的,因为它是基于一个特定的 oracle 数据集,该数据集已通过 dbReadTable 成功加载到 R 中。我只想向使用 ROracle 的任何人强调这一点,这是您可以进入 Rstudio 的内容,以及从 Rstudio 的角度来看,当隐藏列加载到 R 中时它的外观。
有人可以解释 $ 运算符和 [[]] 或存在()之间的内在区别是什么以及为什么 $ 运算符似乎是检测此列的唯一方法
> EXAMPLE_TABLE <-
+ dbReadTable(
+ con_ROracle,
+ schema = SCHEMA_NR,
+ name = TABLE_NAME) %>%
+ head(100)
>
> # names doesn't find the column
>
> "L" %in% names(EXAMPLE_TABLE)
[1] FALSE
>
> # subsetting with [["L"]] doesn't find it
> EXAMPLE_TABLE[["L"]]
NULL
>
> # the function "exists" doesn't find it
>
> exists("L", EXAMPLE_TABLE)
[1] FALSE
>
> # dplyr selection doesn't find it
>
> EXAMPLE_TABLE %>%
+ select(L)
Error: Can't subset columns that don't exist.
x The column `L` doesn't exist.
Run `rlang::last_error()` to see where the error occurred.
>
> # But the $ operator does find it!
> EXAMPLE_TABLE$L
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[53] 1 1 1 1 1 1 1 1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
>
> # And replacing it with a NULL value doesn't work
>
> EXAMPLE_TABLE$L <- NULL
> EXAMPLE_TABLE$L
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[53] 1 1 1 1 1 1 1 1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
>
> # The values of the hidden field are accesible
> new_value <- EXAMPLE_TABLE$L
> new_value
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[53] 1 1 1 1 1 1 1 1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
>
>
> # Only replacing with new values helps
>
> EXAMPLE_TABLE$L <- 5
> EXAMPLE_TABLE$L
[1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[79] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
>
奇怪的是,隐藏列不能用 <- NULL 删除,但可以用它覆盖。
解决方案
使用 $ 选择列时,它不需要完全匹配。您必须有一个名称以 L 开头的列,并且该列是唯一以 L 开头的列。
例如看 mtcars
colnames(mtcars)
# both return the column corresponding to mpg
mtcars$mpg
mtcars$m
推荐阅读
- excel - Excel VBA:过滤、剪切和粘贴到另一个工作表
- angular - 我想在 Angular 8 中快速控制台记录来自此 API 的响应
- css - 如何在 Vue.js 中使用 rowspan 将指针事件应用于简单表?
- android - 切换到 android 中的不同活动时保存活动数据,如 Whatsapp
- angular - 我可以在 Angular 中使用带有柏树的字符串插值吗?
- ionic-framework - 如何自定义 Ionic 本地通知
- node.js - 无法使用 OpenSuse Leap 15.1 中的电子锻造和电子安装程序为目标 win32 构建
- excel - 添加/删除行但仅一次时的VBA消息框
- javascript - 在javascript中给出2个函数的序列
- arrays - 数组没有通过在 excel vba 中使用函数来获取值