2012-04-26 39 views
19

Có chức năng nào có thể thay thế cho dán không? Tôi muốn biết nếu một cái gì đó như thế này tồn tại trong R:Chức năng thay thế để dán

> buildString ("Hi {1}, Have a very nice {2} ! " , c("Tom", "day")) 

Trả lời

25

frankc và DWin là đúng để chỉ cho bạn sprintf().

Nếu vì một số lý do phụ tùng thay thế của bạn thực sự sẽ ở dưới dạng một vector (tức c("Tom", "day")), bạn có thể sử dụng do.call() để vượt qua họ để sprintf():

string <- "Hi %s, Have a really nice %s!" 
vals <- c("Tom", "day") 

do.call(sprintf, as.list(c(string, vals))) 
# [1] "Hi Tom, Have a really nice day!" 
17

Tôi nghĩ rằng bạn đang tìm kiếm chạy nước rút.

Cụ thể:

sprintf("Hi %s, Have a very nice %s!","Tom","day") 
+4

cụ thể 'sprintf ("Hi% s, Có% s rất đẹp!", "Tom", "ngày") '(điền vào một * vectơ * giá trị sẽ phức tạp hơn một chút) –

+3

cho những gì nó giá trị 'sprintf' là trong phần * Xem thêm * của'? dán' (!!) –

+7

Đọc các tệp trợ giúp là gian lận! –

21

Chức năng sprintf là một trong những cách tiếp cận như những người khác đã đề cập, đây là một cách tiếp cận sử dụng gsubfn gói:

> library(gsubfn) 
> who <- "Tom" 
> time <- "day" 
> fn$paste("Hi $who, have a nice $time") 
[1] "Hi Tom, have a nice day" 
+0

rất perlish, cảm ơn! – flodel

+0

cho fn $ dán để làm việc, các biến phải là biến toàn cầu ở đây, có cách nào để sử dụng dán fn $ với biến cục bộ hàm <- function (X) {fn $ paste ("Hello $ X")} .. Tôi thực sự cần một cái gì đó như thế này :-) – MadSeb

+0

Nếu bạn đang sử dụng các đối số từ một hàm thì có vẻ như hàm sprintf sẽ hoạt động. Nếu bạn muốn người dùng có thể cung cấp chuỗi, nhưng hàm của bạn có một tập hợp các biến cụ thể mà họ có thể sử dụng, thì bạn chỉ có thể thực hiện một nhóm các cuộc gọi tới gsub (hoặc gsubfn) để thay thế thể hiện có thể của $ who hoặc $ thời gian. Đây là cách tiếp cận được sử dụng bởi gói blockrand (hàm plot.blockrand). –

17

gói whisker thực hiện điều này rất tốt, và xứng đáng appreciatio rộng hơn n:

require(whisker) 
whisker.render ("Hi {{name}}, Have a very nice {{noun}} ! " , list(name="Tom", noun="day")) 
+0

+1, chức năng đẹp.Tôi cho rằng thứ tự trong danh sách không quan trọng? Một nhược điểm của việc sử dụng này trong một gói sẽ là nó sẽ giới thiệu một sự phụ thuộc vào gói whisker. –

+0

Nếu bạn đang thực sự lo lắng về các phụ thuộc bạn có thể chỉnh sửa (gsubfn) và lưu nó như là một chức năng mới. Nếu bạn đã sử dụng stringr, bạn có thể thử chức năng này (http://blog.aboutwilson.net/posts/2014-04/string-interpolation-in-r/) với mục đích phù hợp với mục đích của bạn một cách chính xác. – ideamotor

1

Với phiên bản 1.1.0 (Cran phát hành trên 2016/08/19), gói stringr đã đạt được một chức năng chuỗi suy str_interp().

Với str_interp() các trường hợp sử dụng sau đây có thể xảy ra:

biến được định nghĩa trong môi trường

v1 <- "Tom" 
v2 <- "day" 
stringr::str_interp("Hi ${v1}, Have a very nice ${v2} !") 
#[1] "Hi Tom, Have a very nice day !" 

biến cung cấp một danh sách có tên là tham số

stringr::str_interp(
    "Hi ${v1}, Have a very nice ${v2} !", 
    list("v1" = "Tom", "v2" = "day")) 
#[1] "Hi Tom, Have a very nice day !" 

Biến định nghĩa trong một vector

values <- c("Tom", "day") 
stringr::str_interp(
    "Hi ${v1}, Have a very nice ${v2} !", 
    setNames(as.list(values), paste0("v", seq_along(values))) 
) 
#[1] "Hi Tom, Have a very nice day !" 

Lưu ý rằng các vector value chỉ có thể lưu trữ dữ liệu của một loại (danh sách là linh hoạt hơn) và các dữ liệu được chèn vào theo thứ tự chúng được cung cấp.

Các vấn đề liên quan