programing

ggplot2 구문이 타당할 때 RCMD 검사 "글로벌 변수에 대한 가시적 바인딩 없음" 참고 사항을 어떻게 처리할 수 있습니까?

goodsources 2023. 6. 5. 23:52
반응형

ggplot2 구문이 타당할 때 RCMD 검사 "글로벌 변수에 대한 가시적 바인딩 없음" 참고 사항을 어떻게 처리할 수 있습니까?

편집: 해들리 위컴은 제가 말을 잘못했다고 지적합니다.RCMD 검사는 경고가 아닌 NOTES를 던지고 있습니다.혼란을 드려 대단히 죄송합니다.제 실수였어요

짧은 버전

R CMD checkggplot2에서 합리적인 플롯-생성 구문을 사용할 때마다 이 노트를 던집니다.

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))
    )
  )
}

이 해결책은 고맙지만 세 가지 이유로 싫어합니다.

  1. 그것은 달래는 것 이상의 추가적인 목적을 제공하지 않습니다.R CMD check.
  2. 그것은 의도를 반영하지 않습니다.그것은 기대감을 높입니다.aes()호출은 실제 목적을 모호하게 하는 동안 Now-NULL 변수를 볼 것입니다(그렇지 않으면 RCMD가 바인딩되었는지 알 수 없는 변수를 확인하게 됩니다).
  3. 플롯 요소를 반환하는 함수를 작성할 때마다 혼란스러운 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링 전략과 유사한 결함이 있다고 생각합니다.

  1. 나는 여전히 모든 플롯 요소 함수를 살펴보고 논리를 다음과 같이 포장해야 합니다.with()를 걸다
  2. with()호출이 오해의 소지가 있습니다.나는 여전히 a를 공급해야 합니다.data = 쟁논; 모두두with()하는 것이 달래는 것입니다.R CMD check.

결론

제가 볼 때, 제가 취할 수 있는 세 가지 옵션은 다음과 같습니다.

  1. CRAN이 (CRAN 정책에 따라) "가짜"라고 주장하여 노트를 무시하도록 로비하고, 패키지를 제출할 때마다 그렇게 합니다.
  2. 가지 않은 전략 중 로 내 를 수정합니다(NULLING 또는 지않하은직람바전다략또는니수합정두나코).with()블록)
  3. 정말 크게 흥얼거리고 문제가 사라지길 바랍니다.

그 세 가지 중 어느 것도 나를 행복하게 하지 않으며, 나는 사람들이 나(그리고 ggplot2를 이용하고자 하는 다른 패키지 개발자들)에게 무엇을 제안해야 하는지 궁금합니다.

두 가지 솔루션이 있습니다.

  • 비표준 평가를 피하기 위해 코드를 다시 작성합니다. ggplot2를 사용한다는 입니다.aes_string()aes()와 같이 (란이설명대로한할대)로▁(

  • 통화 globalVariables(c("x.values", "y.values"))패키지의 최상위 레벨 어딘가에 있습니다.

당신은 Cran에 제출할 때 약간의 번거로운 일을 해야 할 경우에도 패키지에서 NOTES 0을 위해 노력해야 합니다.이것은 CRAN의 삶을 더 쉽게 해주고, 여러분의 삶을 더 쉽게 해줍니다.

(이에 대한 저의 최근 생각을 반영하기 위해 2014-12-31 업데이트)

사용해 보셨습니까?aes_stringaes은 효과가 있을 입니다. 제가해 본은 없지만요.

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))
}

되었습니다..dataggplot2rlang@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

반응형