Closed hslinhares closed 2 months ago
@hslinhares tentei mas não consegui descobrir o que está acontecendo na execução no modo interativo vs dentro da função.
Esse uso que você descobriu não está documentado, porque os argumentos da função deveriam ser:
When used in a validation rule: a bare (unquoted) list of variable names. When used directly, a comma-separated list of vectors of equal length.
Então acho que a gente pode assumir que isso não é possível e criar funções dedicadas para cada base (eg. check_composite_primary_key_acoes
).
@hslinhares tentei mas não consegui descobrir o que está acontecendo na execução no modo interativo vs dentro da função.
Esse uso que você descobriu não está documentado, porque os argumentos da função deveriam ser:
When used in a validation rule: a bare (unquoted) list of variable names. When used directly, a comma-separated list of vectors of equal length.
Então acho que a gente pode assumir que isso não é possível e criar funções dedicadas para cada base (eg.
check_composite_primary_key_acoes
).
Consegui ler a mensagem de erro e o problema não é no formato da variável col
quando chamada pela função, como estavamos achando. Mas sim pq a variável col
não está sendo encontrada, quando ela é definida dentro da função. Se definimos ela no ambiente global, como abaixo, a função funciona. Alguma sugestão pra consertar isso?
sigplan = read_datapackage('https://raw.githubusercontent.com/splor-mg/dados-sigplan-planejamento-2024/a950492b20bd810485fcc92e22570386d268e11e/datapackage.json')
programas <- sigplan$programas_planejamento
df <- programas
cols <- names(programas)
check <- function(
df
){
rules <- validate::validator(
is_complete(df[cols])
)
report <- validate::confront(df, rules)
return(report)
}
check(programas)
# output
Rules confronted: 1
With fails : 1
With missings: 0
Threw warning: 0
Threw error : 0
Depender de uma variável global que tenha o mesmo nome e conteúdo da variável usada dentro da função é frágil.
Melhor a gente ir pra linha de criar funções dedicadas e usar os nomes fixos das colunas que compõem a chave primária.
@fjuniorr o que acha do código em formato parecido com este? Testei e os resultados foram corretos. Os nomes dos argumentos estão ruins ainda.
test <- function(base, col){
if(col == 'programas'){
df <- sigplan$programas_planejamento
rule <- validate::validator(
is_complete(uo_programa_cod, programa_cod, is_deleted_programa, objetivo_estrategico_cod, diretriz_estrategica_cod, ods_titulo),
is_unique(uo_programa_cod, programa_cod, is_deleted_programa, objetivo_estrategico_cod, diretriz_estrategica_cod, ods_titulo)
)
} else if (col == 'acoes'){
df <- sigplan$acoes_planejamento
rule <- validate::validator(
is_complete(uo_acao_cod, acao_cod, is_deleted_acao),
is_unique(uo_acao_cod, acao_cod, is_deleted_acao)
)
}else if (col == 'localizadores'){
df <- sigplan$localizadores_todos_planejamento
rule <- validate::validator(
is_complete(uo_acao_cod, acao_cod, is_deleted_acao, localizador_cod),
is_unique(uo_acao_cod, acao_cod, is_deleted_acao, localizador_cod)
)
}else if (col == 'indicadores'){
df <- sigplan$indicadores_planejamento
rule <- validate::validator(
is_complete(programa_cod, is_deleted_programa, indicador, is_deleted_indicador),
is_unique(programa_cod, is_deleted_programa, indicador, is_deleted_indicador)
)
}
report <- validate::confront(df, rule)
return(report)
}
test(sigplan, 'programas')
# output
Rules confronted: 2
With fails : 1
With missings: 0
Threw warning: 0
Threw error : 0
test(sigplan, 'acoes')
# output
Rules confronted: 2
With fails : 0
With missings: 0
Threw warning: 0
Threw error : 0
test(sigplan, 'localizadores')
# output
Rules confronted: 2
With fails : 0
With missings: 0
Threw warning: 0
Threw error : 0
test(sigplan, 'indicadores')
# output
Rules confronted: 2
With fails : 0
With missings: 0
Threw warning: 0
Threw error : 0
closes https://github.com/splor-mg/dados-sigplan-planejamento/issues/49#issuecomment-2310154094