fenguoerbian Cloud2016
一通debug
之后可能发现了问题所在,这里预期的做图数据应该是5列(3个座标,1个颜色,1个大小),但是出问题的图的做图数据只有4列。
整个call的顺序是e_scatter_3d
--> e_scatter_3d_
--> .build_data2
,其中.build_data2
源码是
.build_data2 <- function(data, ...) {
row.names(data) <- NULL
data <- data |>
dplyr::select(...)
data <- unname(data)
apply(data, 1, function(x) {
list(value = unlist(x, use.names = FALSE))
})
}
在e_scatter_3d_
调用 .build_data2
的时候,使用的语句是
data <- .build_data2(e$x$data[[i]], e$x$mapping$x, y, z, color, size)
以楼主原本的代码而言,可以验证此时在e_scatter_3d_
中,color
和size
都是字符串“mag"
,于是原数据在后续的dplyr::select
中只被提取到了1次。
而我这个莫名其妙的能让图正常的修改,其实就是碰巧我在数据里加了一列叫做color
的列,和这里传入的变量名color
相同。所以如果在我那个修改里把新增的列叫做color_not_work
,那这个图也不会正常生成。
所以这里的核心就是,dplyr::select(...)
中多次选择同一列,结果只会返回1列。而我那个碰巧的做法,实际是这里提到的模糊的名称使用,而在这里恰好起效了。
另外如果.build_data2(data, ...)
的...
里如果传入的实际上是列名的字符串,那么按照前述链接里的建议的话,为了消除语义中的模糊,可以修改成
dplyr::select(tidyselect::all_of(c(...)))
但是本质上从这里来看,同样的变量被多次选择,只会返回1次,于是做图数据缺了1列。不过消除歧义总是有好处的,比方说在这里,如果原始数据里有"y"
, "z"
这样的列名,那么这里也会优先选取那两列,而不是传入的y
,z
参数中保存的列名。