6 votes

Passer un argument de caractère et l'évaluer

J'ai un opérateur logique et une valeur numérique que je veux passer en tant qu'élément unique à une déclaration dans une fonction (j'entends des centaines d'utilisateurs de R gémir ; je ne fais jamais cela, mais il y a une situation où je pense que c'est acceptable).

DF <- mtcars
overlap = "> 2"
as.numeric(rowSums(DF[, 1:6]) overlap)

Comment puis-je faire en sorte que la troisième ligne fonctionne comme suit :

as.numeric(rowSums(DF[, 1:6]) > 2)

Je sais qu'il est probable eval y parse mais ne les utilise jamais et ne comprend donc pas vraiment comment les utiliser ici.

7voto

mnel Points 48160

Quelque chose comme

Olap <- unlist(strsplit( overlap, " "))
Thresh <- as.numeric(Olap[2])
Comp <- match.fun(Olap[1])
Comp(rowSums(DF[,1:6]), Thresh)

Une alternative est d'évaluer et d'analyser comme vous l'avez suggéré

What <- rowSums( DF[,1:6])

 textcall <- sprintf(" What %s", overlap)

 exprcall <- parse(text = textcall)

 eval( exprcall)

7voto

Ricardo Saporta Points 22951

Vous devez convertir l'expression entière en une chaîne de caractères, puis convertir le texte analysé en une expression. Enfin, vous devez appeler eval() sur l'expression.

eg :

overlap <- "> 2"

# Convert to string
exprAsString <- paste0("as.numeric(rowSums(DF[, 1:6]) ", overlap, ")")

# Convert to expression, using parse
expr <- as.expression(parse(text=exprAsString))

# Then call eval()
eval(expr)

Confirmation de son efficacité :

identical(eval(expr), as.numeric(rowSums(DF[, 1:6]) > 2))
# [1] TRUE

1voto

Carl Witthoft Points 9799

Il me semble que, bien que la solution de @mnel soit bonne, il s'agit d'une situation qui pourrait être résolue en créant une fonction fictive à l'intérieur de votre fonction principale et en utilisant votre chaîne d'entrée ( overlap ) comme argument pour modifier body(dummy_function) . Cela pourrait être beaucoup plus propre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X