2015-10-08 16 views
5

Tôi có một ký tự trong R, nói "\\frac{A}{B}". Và tôi có các giá trị cho AB, nói 510. Có cách nào để tôi có thể thay thế AB bằng 510 không?Thay thế tên biến trong chuỗi có giá trị biến [R]

Tôi đã thử cách sau.

words <- "\\frac{A}{B}" 
numbers <- list(A=5, B=10) 
output <- do.call("substitute", list(parse(text=words)[[1]], numbers)) 

Nhưng tôi gặp lỗi trên \. Có cách nào để tôi có thể làm điều này không? Tôi cố gắng để tạo ra phương trình với các giá trị biến thực tế.

+0

cách tiếp cận chung của bạn sẽ không làm việc cho bạn. Nếu bạn thử mã của bạn với 'từ <-" frac {A} {B} "' bạn nhận được 'Lỗi trong phân tích cú pháp (văn bản = từ): : 1: 5: bất ngờ '{' 1: frac {' –

+0

@ ShawnMehan - Vâng, tôi cũng đã thử điều đó. Có vẻ như có một số cách chung để làm điều này, như 'sprintf' hay cái gì đó, nhưng tôi không thể hiểu được. Cảm ơn. –

Trả lời

3

Bạn có thể sử dụng stringi chức năng stri_replace_all_fixed()

stringi::stri_replace_all_fixed(
    words, names(numbers), numbers, vectorize_all = FALSE 
) 
# [1] "\\frac{5}{10}" 
1

Tôi quen thuộc hơn với gsub hơn substitute. Các công trình sau:

words <- "\\frac{A}{B}" 
numbers <- list(A=5, B=10) 
arglist = mapply(list, as.list(names(numbers)), numbers, SIMPLIFY=F) 
for (i in 1:length(arglist)){ 
    arglist[[i]]["x"] <- words 
    words <- do.call("gsub", arglist[[i]]) 
} 

Nhưng tất nhiên điều này là không an toàn vì bạn đang lặp qua thay thế. Nếu, giả sử biến đầu tiên có giá trị "B" và biến thứ hai có tên "B", bạn sẽ gặp sự cố. Có lẽ là một cách sạch hơn.

2

Hãy thử điều này:

sprintf(gsub('\\{\\w\\}','\\{%d}',words),5,10) 
Các vấn đề liên quan