ggplot2 구문이 타당할 때 RCMD 검사 "글로벌 변수에 대한 가시적 바인딩 없음" 참고 사항을 어떻게 처리할 수 있습니까?
편집: 해들리 위컴은 제가 말을 잘못했다고 지적합니다.RCMD 검사는 경고가 아닌 NOTES를 던지고 있습니다.혼란을 드려 대단히 죄송합니다.제 실수였어요
짧은 버전
R CMD check
ggplot2에서 합리적인 플롯-생성 구문을 사용할 때마다 이 노트를 던집니다.
no visible binding for global variable [variable name]
RCMD 검사가 그렇게 하는 이유는 이해하지만, 그렇지 않으면 합리적인 구문의 전체 정맥을 범죄로 간주하는 것 같습니다.는 제 할지 잘 .R CMD check
그리고 CRAN에 입원합니다.
배경
Sasscha Epskamp는 본질적으로 동일한 이슈에 대해 이전에 게시했습니다.제 생각에 다른 점은subset()
의 맨페이지에 따르면 대화형 사용을 위해 설계되었다고 합니다.
경우는 않았습니다.subset()
하만핵심특인의 에.ggplot2
그자리의 data =
논쟁.
이러한 노트를 생성하는 내가 작성하는 코드의 예
다음은 그래프에 점을 추가하는 패키지의 하위 기능입니다.
JitteredResponsesByContrast <- function (data) {
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
R CMD check
이 코드를 구문 분석할 때, 다음과 같이 말할 것입니다.
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
RCMD 검사가 올바른 이유
그 수표는 기술적으로 정확합니다. x.values
그리고.y.values
- 다 기능에 로컬로 정의되어 있지
JitteredResponsesByContrast()
- 양식에 미리 정의되어 있지 않습니다.
x.values <- [something]
전체적으로 또는 발신자 내에서.
대신, 데이터 프레임 내의 변수로, 이전에 정의되어 함수에 전달됩니다.JitteredResponsesByContrast()
.
ggplot2가 RCMD 검사를 완화하기 어려운 이유
는 ggplot2의 하는 것 .data
이 가 이터 인 수 아 실 코 이 는 유 입
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
그러나 이 코드는 개체를 찾을 수 없는 오류를 생성합니다.
library(ggplot2)
hwy # a variable in the mpg dataset
두 가지 해결 방법과 두 가지 모두 만족스럽지 못한 이유
NULL 제거 전략
Matthew Dowle은 먼저 문제가 있는 변수를 NULL로 설정할 것을 권장합니다. 이 경우 다음과 같습니다.
JitteredResponsesByContrast <- function (data) {
x.values <- y.values <- NULL # Setting the variables to NULL first
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
이 해결책은 고맙지만 세 가지 이유로 싫어합니다.
- 그것은 달래는 것 이상의 추가적인 목적을 제공하지 않습니다.
R CMD check
. - 그것은 의도를 반영하지 않습니다.그것은 기대감을 높입니다.
aes()
호출은 실제 목적을 모호하게 하는 동안 Now-NULL 변수를 볼 것입니다(그렇지 않으면 RCMD가 바인딩되었는지 알 수 없는 변수를 확인하게 됩니다). - 플롯 요소를 반환하는 함수를 작성할 때마다 혼란스러운 NULL 명령문을 추가해야 하기 때문에 1과 2의 문제가 증가합니다.
위드() 전략
사용할 수 있습니다.with()
문제의 변수가 더 큰 환경 내에서 발견될 수 있음을 명시적으로 알리는 것입니다. 경우에는 내경, 용사를 요.with()
다음과 같이 표시됩니다.
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
이 솔루션은 작동합니다.하지만 이 솔루션은 제가 기대하는 방식으로 작동하지 않기 때문에 마음에 들지 않습니다.한다면with()
우리는 정말로 변수가 어디에 있는지 통역사를 가리키는 문제를 해결했고, 그러면 나는 심지어 필요하지도 않습니다.data =
논쟁.그렇지만,with()
그런 식으로 작동하지 않습니다.
library(ggplot2)
p <- ggplot()
p <- p + with(mpg, geom_point(aes(x = hwy, y = cty)))
p # will generate an error saying `hwy` is not found
따라서 이 솔루션에는 NULL링 전략과 유사한 결함이 있다고 생각합니다.
- 나는 여전히 모든 플롯 요소 함수를 살펴보고 논리를 다음과 같이 포장해야 합니다.
with()
를 걸다 - 그
with()
호출이 오해의 소지가 있습니다.나는 여전히 a를 공급해야 합니다.data =
쟁논; 모두두with()
하는 것이 달래는 것입니다.R CMD check
.
결론
제가 볼 때, 제가 취할 수 있는 세 가지 옵션은 다음과 같습니다.
- CRAN이 (CRAN 정책에 따라) "가짜"라고 주장하여 노트를 무시하도록 로비하고, 패키지를 제출할 때마다 그렇게 합니다.
- 가지 않은 전략 중 로 내 를 수정합니다(NULLING 또는 지않하은직람바전다략또는니수합정두나코).
with()
블록) - 정말 크게 흥얼거리고 문제가 사라지길 바랍니다.
그 세 가지 중 어느 것도 나를 행복하게 하지 않으며, 나는 사람들이 나(그리고 ggplot2를 이용하고자 하는 다른 패키지 개발자들)에게 무엇을 제안해야 하는지 궁금합니다.
두 가지 솔루션이 있습니다.
비표준 평가를 피하기 위해 코드를 다시 작성합니다. ggplot2를 사용한다는 입니다.
aes_string()
에aes()
와 같이 (란이설명대로한할대)로▁(통화
globalVariables(c("x.values", "y.values"))
패키지의 최상위 레벨 어딘가에 있습니다.
당신은 Cran에 제출할 때 약간의 번거로운 일을 해야 할 경우에도 패키지에서 NOTES 0을 위해 노력해야 합니다.이것은 CRAN의 삶을 더 쉽게 해주고, 여러분의 삶을 더 쉽게 해줍니다.
(이에 대한 저의 최근 생각을 반영하기 위해 2014-12-31 업데이트)
사용해 보셨습니까?aes_string
에 aes
은 효과가 있을 입니다. 제가해 본은 없지만요.
aes_string(x = 'x.values', y = 'y.values')
이 질문은 얼마 전에 묻고 답했지만 참고를 위해 버전 2.1.0부터 노트를 우회할 수 있는 다른 방법이 있습니다.aes_(x=~x.values,y=~y.values).
2019년에, 이것을 피하는 가장 좋은 방법은 사용하는 것입니다..data
로 사용합니다.rlang
패키지, 다음으로 내보낼 패키지ggplot2
이것은 R에게 치료하라고 말합니다.x.values
그리고.y.values
…의 로서.data.frame
(정의되지 않은 변수에 대해 불평하지 않습니다.)
참고: 데이터 입력에 존재할 것으로 알고 있는 미리 정의된 열 이름이 있는 경우에 가장 적합합니다.
#' @importFrom ggplot2 .data
my_func <- function(data) {
ggplot(data, aes(x = .data$x, y = .data$y))
}
되었습니다..data
ggplot2
에 rlang
@Noah 멘반기합니다로으를트코▁.
한다면
getRversion() >= "3.1.0"
패키지의 최상위 수준에서 호출을 추가할 수 있습니다.
utils::suppressForeignCheck(c("x.values", "y.values"))
출처:
help("suppressForeignCheck")
패키지 수준 문서를 제공하는 파일에 다음 코드 줄을 추가합니다.
if(getRversion() >= "2.15.1") utils::globalVariables(c("."))
여기 예
get()를 사용하는 것은 어떻습니까?
geom_point(
aes(
x = get('x.values'),
y = get('y.values')
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
?aes_string에 대한 설명서에 다음과 같이 나와 있기 때문입니다.
이러한 모든 기능은 소프트하게 사용되지 않습니다.대신 깔끔한 평가 관용구를 사용하십시오(aes() 설명서의 준인용 섹션 참조).
그래서 저는 그 페이지를 읽고 다음과 같은 패턴을 생각해냈습니다.
ggplot2::aes(x = !!quote(x.values),
y = !!quote(y.values))
그것은 마치 IIF처럼 도망치고, 기본적인 표현과 깔끔한 뱅뱅을 혼합합니다.그러나 글로벌 변수에 대한 해결책도 필요하지 않으며, 사용되지 않는 오류도 사용하지 않습니다.미학적 계산과 파생 변수와 함께 작동하는 것 같습니다...count..
언급URL : https://stackoverflow.com/questions/9439256/how-can-i-handle-r-cmd-check-no-visible-binding-for-global-variable-notes-when
'programing' 카테고리의 다른 글
R에서 정수 클래스와 숫자 클래스의 차이점은 무엇입니까? (0) | 2023.06.05 |
---|---|
UIViewControllerContextTransition을 사용하여 "From ViewController"가 사라짐 (0) | 2023.06.05 |
대화형 Python 셸에서 마지막 결과 가져오기 (0) | 2023.06.05 |
동일한 그래프에 두 그래프 표시 (0) | 2023.06.05 |
Android:이전 활동으로 돌아가기 (0) | 2023.06.05 |