ROracle在R中创建阴影或不可见列

ROracle在R中创建阴影或不可见列,oracle,hidden-field,rstudio-server,roracle,Oracle,Hidden Field,Rstudio Server,Roracle,使用ROracle读取到Rstudio服务器的data.frame时,我遇到了一些非常奇怪的行为。数据中似乎有一个额外的列,一开始R似乎没有检测到,但仍然有很多 我以前没有意识到oracle隐藏字段,因此遇到了这个问题,这可以解释这种现象。 然而,这对我来说仍然是非常奇怪的,在R中这甚至是可能的,并且不一致性令人困惑。当然,这个示例是不可复制的,因为它基于一个特定的oracle数据集,该数据集已通过dbReadTable成功加载到R中。我只想向所有使用ROracle的人强调这一点,这就是你可以

使用ROracle读取到Rstudio服务器的data.frame时,我遇到了一些非常奇怪的行为。数据中似乎有一个额外的列,一开始R似乎没有检测到,但仍然有很多

我以前没有意识到oracle隐藏字段,因此遇到了这个问题,这可以解释这种现象。

然而,这对我来说仍然是非常奇怪的,在R中这甚至是可能的,并且不一致性令人困惑。当然,这个示例是不可复制的,因为它基于一个特定的oracle数据集,该数据集已通过dbReadTable成功加载到R中。我只想向所有使用ROracle的人强调这一点,这就是你可以进入Rstudio的地方,从Rstudio的角度来看,当一个隐藏列加载到R中时,它是什么样子

有人能解释一下$operator和[[]]或exists()之间的内在区别吗?为什么$operator似乎是检测此列的唯一方法

> 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

>
>示例\u表%
+总目(100)
> 
>#名称找不到该列
> 
>“L”%in%名称(示例\u表)
[1] 假的
> 
>#使用[[“L”]]进行子集设置找不到它
>示例_表[[“L”]]
无效的
> 
>#函数“exists”没有找到它
> 
>存在(“L”,示例表)
[1] 假的
> 
>#dplyr选择未找到它
> 
>示例\u表%>%
+选择(L)
错误:无法子集不存在的列。
“L”列不存在。
运行`rlang::last_error()`查看错误发生的位置。
> 
>#但$operator确实找到了!
>示例_表$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钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
> 
>#并用空值替换它不起作用
> 
>示例\表$L示例\表$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  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钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
> 
> 
>#只有用新值替换才有帮助
> 
>示例\表$L示例\表$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
>

奇怪的是,当使用$选择不需要精确匹配的列时,无法使用删除隐藏列。您必须有一个名称以L开头的列,这是唯一一个以L开头的列

以mtcars为例

 colnames(mtcars)
 # both return the column corresponding to mpg
 mtcars$mpg
 mtcars$m

使用$选择列时,不需要精确匹配。您必须有一个名称以L开头的列,这是唯一一个以L开头的列

以mtcars为例

 colnames(mtcars)
 # both return the column corresponding to mpg
 mtcars$mpg
 mtcars$m

我不知道!好的,谢谢,这就解决了问题。为了不引起混乱,我想应该删除这个帖子……我不知道!好的,谢谢,这就解决了问题。我想应该删掉这篇文章,以免引起混乱。。